java - 甚至没有使用的 ImageIcon 正在影响我的 JFrame/JPanel。为什么?

标签 java swing imageicon

我希望这不是一个愚蠢的第一个问题;无论如何我似乎都找不到答案。

我有这个 JFrame 构造函数,其中将 JPanel 添加到 JFrame 中。 JPanelJFrame 中绘制一个矩形,这很好。 但是,如果我添加一个 ImageIcon 对象(如下面的代码所示)(供以后使用),则不会绘制矩形。如果我调整窗口大小,它确实会出现。

一种解决方案是将 setVisible(true) 放在最后一行,或者在构造函数上方实例化 ImageIcon ,但我真的很想理解这一点。对我来说,一个甚至没有使用的对象会导致这种行为是没有意义的。谢谢。

public class AJFrame extends JFrame {

    ImageIcon ii;

    public AJFrame() {
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);

        ImageIcon ii = new ImageIcon("Untitled.png");

        JPanel jp = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                g.fillRect(0, 0, 50, 50);
            }
        };

        add(jp);
    }

    public static void main(String[] args) {
        AJFrame jf = new AJFrame();
    }
}

最佳答案

一帧内的所有 Action 都应该在 Swing 的 EDT(事件调度线程)中完成。因此启动框架的正确方法是

java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new AJFrame().setVisible(true);
        }
});

所以也许这一切都归结于你的框架的错误开始。

Java 程序的主例程不在 EDT 内启动。所有不在 EDT 内的 Swing 操作都可能会产生奇怪的刷新/可见性问题。

这是完整的源代码:

public class AJFrame extends JFrame {

    ImageIcon ii;

    public AJFrame() {
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        //setVisible(true);

        //ImageIcon ii = new ImageIcon("Untitled.png");
        JPanel jp = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                g.fillRect(0, 0, 50, 50);
            }
        };

        add(jp);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AJFrame().setVisible(true);
            }
        });
    }
}

关于java - 甚至没有使用的 ImageIcon 正在影响我的 JFrame/JPanel。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21767590/

相关文章:

java - 使用 JDBC 的内存泄漏应用程序

java - 将英语数字转换为阿拉伯语的最佳方法

java - JTable 当前显示多少行?

java - MouseEvents 和 Icon/ImageIcon

java - 在 Java 中显示一张笑脸

java - 保持 java 套接字打开 - 如何检查新数据是否可用?

java - 如何在 Spring Mail Integration 中启用 IMAPFolder 读写模式

java - 如何让 GUI 按钮正确响应?

java - 调整 JComponent 的大小以进行文件导出

java - ImageIcon.paintIcon 不在 JPanel 上绘制图像