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的答案。