繼承 JPanel,覆寫 paintComponent 繪製背景圖,並將此面板置於容器最底層(z-index = -1),使其成為真正的「背景層」。
import javax.swing.JPanel;
import java.awt.*;
import java.awt.image.ImageObserver;
public class CustomImgPanel extends JPanel {
private int width, height;
private final String imgPath;
public CustomImgPanel(int w, int h, String path) {
this.width = w; this.height = h; this.imgPath = path;
setSize(width, height); setVisible(true);
}
public CustomImgPanel(double w, double h, String path) {
this((int)w, (int)h, path);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Image img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(imgPath));
g2.drawImage(img, 0, 0, width, height, this);
}
}
// 初始化:取得螢幕尺寸扣除標題列與狀態列高度 double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); double h = Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 70; CustomImgPanel imgPanel = new CustomImgPanel(w, h, "../form/images/mainBg.jpg"); mainPanel.add(imgPanel, -1); // -1 代表最底層
監聽父視窗的 ComponentEvent,重建背景面板以適應新尺寸:
private void formComponentResized(ComponentEvent evt) {
try { mainPanel.remove(imgPanel); } catch (Exception ignored) {}
imgPanel = null;
Dimension sz = evt.getComponent().getSize();
imgPanel = new CustomImgPanel(sz.getWidth(), sz.getHeight() - 70, "../form/images/mainBg.jpg");
mainPanel.add(imgPanel, -1);
mainPanel.revalidate();
mainPanel.repaint();
}
Toolkit.getImage 非同步載入圖片,配合 ImageObserver(this)自動觸發重繪。getClass().getResource(),利於打包部署。