我试图理解为什么下面的短代码不起作用。
我知道没有布局或组件的大小为0时,不会调用paint组件方法。
但是这里不是这种情况。
您能解释为什么我不能为此设置背景吗?
public class Login extends JPanel {
private BufferedImage bgImage;
public Login() {
super();
initImages();
setLayout(new BorderLayout());
setPreferredSize(new Dimension(600, 600));
add(new JLabel("Hi"), BorderLayout.CENTER);
}
private void initImages() {
try {
bgImage = ImageIO.read(new File("images/login.jpg"));
System.out.println("image loaded");
} catch (IOException e) {
e.printStackTrace();
System.out.println("image not loaded");
}
}
@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.drawImage(bgImage, 0, 0, null);
System.out.println("repaint");
}
public static void createAndShowGui() {
JFrame frame = new JFrame();
Login login = new Login();
frame.add(login, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
最佳答案
如果您想让它正常工作,则需要进行更改...
@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.drawImage(bgImage, 0, 0, null);
System.out.println("repaint");
}
更像...
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bgImage, 0, 0, this);
}
paintComponent
负责绘制组件的“底部”层,paintComponents
负责绘制子级