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

时间:2014-02-13 23:10:59

标签: java swing imageicon

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

我有这个JFrame构造函数,JPanel添加了JFrameJPanelRectangle中绘制JFrame,这很好。 但是,如果我在下面的代码中添加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();
    }
}

1 个答案:

答案 0 :(得分:0)

框架内的所有操作都应该在Swing的EDT(Event Dispatching Thread)中完成。因此,启动框架的正确方法是

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);
            }
        });
    }
}