`super.paintComponent(g)是强制性的吗?

时间:2015-04-06 19:38:22

标签: java

我在课堂上学过,也在本书(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的方法版本(现在被覆盖)。为什么这需要发生?如果我直到现在一直忽略这个陈述会怎么样?

1 个答案:

答案 0 :(得分:1)

  

为什么需要这样做?如果我直到现在一直在做这个陈述,会发生什么呢?

组件负责完全绘画。每个LAF的默认绘画可能不同,因此通过调用super.paintComponent(),您可以确保获得默认绘画,它基本上只是背景。

如果您不调用此方法,则可能会出现绘制工件。然后可能并不总是发生,但你不想浪费时间调试。

阅读paintComponent() JComponent方法的API。其中包括:

此外,如果你没有调用超级实现,你必须遵守opaque属性,即如果这个组件是不透明的,你必须用非不透明的颜色完全填充背景。如果您不遵守opaque属性,您可能会看到视觉瑕疵。

所以至少你需要:

g.fillRect(0, 0, getWidth(), getHeight());

确保在开始自定义绘画之前清除背景。