1

我创建了一个测试版本来简化我为你们遇到的问题:

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 就会出现!(真的,我不得不寻找这个错误很久了)。现在,我怎样才能使窗口既可以使用图形又可以定期绘制组件?提前致谢

4

1 回答 1

7

1)你不应该覆盖paint(..)JFrame除非你有特定的目的。

Swing中正确的绘制方法是:

  • 添加JPanelJFrame
  • in JPanel,覆盖paintComponent(..)getPreferredSize()返回Dimension适合我们绘图的正确 s。注意不要忘记super.paintComponent(g)在覆盖paintComponent方法中调用作为第一个调用以尊重油漆链

请参阅我的这个答案,其中为您提供了一些示例。

  • 也不要JFrame不必要地扩展。
  • 不要调用setSize而是JFrame使用正确LayoutManager和/或覆盖getPreferredSize()- 通常JPanel在我们直接绘制时完成,或者JPanel如果没有添加组件,则将没有大小,如果它们是,它只会与它需要的大小一样大以适合组件和不是图像。
  • 而不是pack()JFrame设置它可见之前调用。

只是以防万一看看Swing 中的并发,尤其是Event-Dispatch-Thread

于 2013-06-28T21:16:15.470 回答