我希望这不是一个愚蠢的第一个问题;无论如何我似乎无法找到答案。
我有这个JFrame
构造函数,JPanel
添加了JFrame
。 JPanel
在Rectangle
中绘制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();
}
}
答案 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);
}
});
}
}