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

use*_*888 1 java swing paint jframe 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
    }
}
Run Code Online (Sandbox Code Playgroud)

当你启动程序时,你会看到一个完美的空白窗口.但是,如果删除paint方法,JLabel会显示出来!(我不得不长时间搜索这个bug,真的).现在,我如何启用一个窗口来使用图形和定期绘制组件?提前致谢

Dav*_*amp 7

1)你不应该忽略paint(..)JFrame,除非你有一个特定的目的.

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

  • 添加JPanelJFrame
  • in JPanel,覆盖paintComponent(..)getPreferredSize()返回Dimension适合我们绘图的正确s.NB不要忘记super.paintComponent(g)在重写paintComponent方法中调用第一个调用以表示绘制链

看到我的这个答案,其中有几个例子.

  • 也不要延长JFrame不必要的时间.
  • 不叫setSizeJFrame,而用正确的LayoutManager和/或重写getPreferredSize()-通常在做JPanel的时候,我们是直接绘制或JPanel将没有大小,如果没有添加成分,如果他们是因为它需要适应成分也只会是大和不是形象.
  • 比调用pack()JFrame设置它可见之前.

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