我在课堂上学过,也在本书(Big Java Early Objects)中看到,在将JComponent扩展为的类中包含绘图指令:
public class Component extends JComponent {
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Rectangle r = new Rectangle(0,0,20,10);
g2.draw(r);
}
}
然而,有人指出paintComponent方法的第一行应该是:super.paintComponent(g);
基于我有限的知识,我相信它正在调用JComponent的方法版本(现在被覆盖)。为什么这需要发生?如果我直到现在一直忽略这个陈述会怎么样?
答案 0 :(得分:1)
为什么需要这样做?如果我直到现在一直在做这个陈述,会发生什么呢?
组件负责完全绘画。每个LAF的默认绘画可能不同,因此通过调用super.paintComponent(),您可以确保获得默认绘画,它基本上只是背景。
如果您不调用此方法,则可能会出现绘制工件。然后可能并不总是发生,但你不想浪费时间调试。
阅读paintComponent()
JComponent
方法的API。其中包括:
此外,如果你没有调用超级实现,你必须遵守opaque属性,即如果这个组件是不透明的,你必须用非不透明的颜色完全填充背景。如果您不遵守opaque属性,您可能会看到视觉瑕疵。
所以至少你需要:
g.fillRect(0, 0, getWidth(), getHeight());
确保在开始自定义绘画之前清除背景。