我已经创建了一个测试版本来简化我遇到的问题:
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
JLabel l = new JLabel("hello");
JPanel cp;
public Test(){
setContentPane(cp = new JPanel());
cp.add(l);
setSize(200, 200);
setVisible(true);
}
public void paint(Graphics g){
//do absolutely nothing
}
}
当你启动程序时,你会看到一个完全空白的窗口。但是,如果删除paint方法,JLabel会显示出来! (我不得不长时间搜索这个bug,真的)。现在,我如何启用一个窗口来使用图形和定期绘制组件? 提前致谢
答案 0 :(得分:7)
1)除非您有特定的目的,否则不应覆盖paint(..)
的{{1}}。
在Swing中绘制的正确方法是:
JFrame
添加到JPanel
JFrame
中paintComponent(..)
和JPanel
以返回符合我们绘图的正确getPreferredSize()
。
注意,不要忘记在重写的Dimension
方法中调用super.paintComponent(g)
作为第一次调用以尊重画颜链 请参阅我的this回答,其中有几个例子。
paintComponent
。JFrame
,而应使用正确的setSize
和/或覆盖JFrame
- 通常在LayoutManager
时直接绘制或如果没有添加任何组件,getPreferredSize()
将没有大小,如果它们只是满足组件而不是图像所需的大小。JPanel
上致电JPanel
,然后再将其设为可见。