我希望这不是一个愚蠢的第一个问题;无论如何我似乎都找不到答案。
我有这个 JFrame
构造函数,其中将 JPanel
添加到 JFrame
中。 JPanel
在 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();
}
}
最佳答案
一帧内的所有 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/