paint(Graphics g)可以防止绘制组件

时间:2013-06-28 21:13:20

标签: java swing jframe paint paintcomponent

我已经创建了一个测试版本来简化我遇到的问题:

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,真的)。现在,我如何启用一个窗口来使用图形和定期绘制组件? 提前致谢

1 个答案:

答案 0 :(得分:7)

1)除非您有特定的目的,否则不应覆盖paint(..)的{​​{1}}。

在Swing中绘制的正确方法是:

  • JFrame添加到JPanel
  • JFrame
  • ,覆盖paintComponent(..)JPanel以返回符合我们绘图的正确getPreferredSize()。 注意,不要忘记在重写的Dimension方法中调用super.paintComponent(g)作为第一次调用以尊重画颜链

请参阅我的this回答,其中有几个例子。

  • 也不要不必要地延长paintComponent
  • 请勿在{{1​​}}上致电JFrame,而应使用正确的setSize和/或覆盖JFrame - 通常在LayoutManager时直接绘制或如果没有添加任何组件,getPreferredSize()将没有大小,如果它们只是满足组件而不是图像所需的大小。
  • 而不是在JPanel上致电JPanel,然后再将其设为可见。

只是看看Concurrency in Swing,尤其是Event-Dispatch-Thread