Java 绘制(图形g)可防止绘制零部件

Java 绘制(图形g)可防止绘制零部件,java,swing,jframe,paint,paintcomponent,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;

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

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)您不应该覆盖
JFrame
paint(..)
,除非您有特定的用途

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

  • JPanel
    添加到
    JFrame
  • JPanel
    中,覆盖和
    getPreferredSize()
    以返回适合我们的图形的正确
    尺寸。
    注意:不要忘记调用
    super.paintComponent(g)
    作为覆盖的
    paintComponent
    方法中的第一个调用,以尊重绘制链
请看我的答案,其中有几个例子

  • 也不要不必要地扩展JFrame
  • 不要在
    JFrame
    上调用
    setSize
    ,而是使用正确的
    LayoutManager
    和/或覆盖
    getPreferredSize()
    -通常在
    JPanel
    上直接绘图时执行,或者如果没有添加组件,
    JPanel
    将没有大小,如果是这样,它的大小将取决于它是否适合组件,而不是图像
  • 然后调用
    JFrame
    上的
    pack()
    ,然后将其设置为可见
为了以防万一,特别是看一看,你不应该覆盖
JFrame
paint(..)
,除非你有特定的目的

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

  • JPanel
    添加到
    JFrame
  • JPanel
    中,覆盖和
    getPreferredSize()
    以返回适合我们的图形的正确
    尺寸。
    注意:不要忘记调用
    super.paintComponent(g)
    作为覆盖的
    paintComponent
    方法中的第一个调用,以尊重绘制链
请看我的答案,其中有几个例子

  • 也不要不必要地扩展JFrame
  • 不要在
    JFrame
    上调用
    setSize
    ,而是使用正确的
    LayoutManager
    和/或覆盖
    getPreferredSize()
    -通常在
    JPanel
    上直接绘图时执行,或者如果没有添加组件,
    JPanel
    将没有大小,如果是这样,它的大小将取决于它是否适合组件,而不是图像
  • 然后调用
    JFrame
    上的
    pack()
    ,然后将其设置为可见

为了以防万一,特别是看看

,您不应该覆盖顶层窗口的
绘制(…)
方法,因为它很少是必需的,而且通常是有害的。更多信息,请参见Dave的答案。您不应该覆盖顶级窗口的
paint(…)
方法,因为它很少是必需的,而且通常是有害的。更多信息,请参见Dave的答案。