paintComponent 中繪製背景圖片後未調用 super.paintComponent(g),導致子組件 (JLabel、JButton) 未被正常繪製。null 佈局 (絕對定位) 但未正確設定組件 bounds,或背景面板未設定 setOpaque(false) 導致遮擋。setOpaque(false) 才能顯示背景圖片上的文字。class BackgroundPanel extends JPanel {
private Image bgImage;
public BackgroundPanel(String imgPath) {
bgImage = new ImageIcon(imgPath).getImage();
setOpaque(false); // 關鍵:讓面板透明,不遮擋背景
setLayout(new FlowLayout()); // 或其他佈局
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 必須第一行調用,確保子組件正常繪製
if (bgImage != null) {
g.drawImage(bgImage, 0, 0, getWidth(), getHeight(), this);
}
}
}
// 使用方式
JFrame frame = new JFrame();
BackgroundPanel panel = new BackgroundPanel("bg.jpg");
panel.add(new JLabel("標籤文字")); // 需 label.setOpaque(false)
panel.add(new JButton("按鈕"));
frame.setContentPane(panel);
通常是因為按鈕邊框/背景繪製異常,嘗試:
button.setContentAreaFilled(false) 關閉預設填充。button.setFocusPainted(false) 關閉焦點邊框。百度知道相關討論:Java Swing 背景圖片顯示問題解決