java - 尽管 JPanel 设置了 PreferredSize,但 PaintComponent() 并未被调用

标签 java swing jframe jpanel

我试图理解为什么下面的短代码不起作用。 据我所知,当没有布局或组件的大小为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 负责绘制子组件

关于java - 尽管 JPanel 设置了 PreferredSize,但 PaintComponent() 并未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43022050/

相关文章:

java - 将 JFrame 加载到 html 中

java - 如何使 Netbeans 7.4 中的编辑器字体看起来像 7.3 中的一样?

java - spring 4 mvc + Hibernate + Annotations 配置堆内存问题

java - 在java中提升数字的字符串输入

java - 如何让 JTable 停留在编辑的单元格上

java - 在java中复制到JEditorPane时如何保持字体不变?

java - JProgressbar 未出现在框架中

java - 如果字符串对象被实习那么为什么改变一个不影响其他

java - JLabel 的 ActionListener 具有图片初始化

java - 当 Class 扩展 JFrame 时,httpunit 不起作用