paintComponent和super.paintComponent

时间:2015-04-20 14:44:22

标签: java swing jpanel jcomponent

我是Java的新手。下面是两个类,一个类扩展JComponent,需要覆盖paintComponent方法。另一个类扩展JPanel,还需要覆盖paintComponent方法。

为什么DrawingPanel类(扩展JPanel)需要调用super.paintComponent(g)方法,但CollageComponent(扩展JComponent)并不需要致电super.paintComponent(g)

我很困惑。

public class CollageComponent extends JComponent {

    public void paintComponent(Graphics g) {

        g.setColor(Color.ORANGE);
        g.fillRect(100, 50, 300, 75);

        // inner green fill
        g.setColor(Color.GREEN);
        g.fillOval(300, 75, 100, 75);

    }
}


public class DrawingPanel extends JPanel {

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.ORANGE);
        g.fillRect(100, 50, 300, 75);

        // inner green fill
        g.setColor(Color.GREEN);
        g.fillOval(300, 75, 100, 75);

    }
}

2 个答案:

答案 0 :(得分:3)

通过调用super.paintComponent(),您可以确保为该组件和LAF完成默认绘制。

对于JPanel,这基本上意味着背景被绘制。每个LAF的背景可能不同。

对于JComponent,确实没有默认绘制,因为每个扩展JComponent的类都负责确保绘制组件的整个区域。

在您的简单示例中,代码将起作用,因为默认情况下JComponent是透明的,这意味着背景由组件的父级绘制。如果没有绘制整个背景,那么有可能在某些条件下出现绘画文物(我现在不记得)。

但是,如果任何LAF决定他们要为JComponent类安装​​默认绘制,那么您的代码将永远不会使用该绘制,并且您的组件在该LAF中看起来会很奇怪。因此,在进行自定义绘制时调用super.paintComponent()总是更安全。

编辑:

绘制背景的标准代码是:

if (isOpaque()) 
{
    g.setColor(getBackground());
    g.fillRect(0, 0, getWidth(), getHeight());
}

您只需在paintComponent()方法的开头添加此代码。

答案 1 :(得分:1)

根据java -awt / swing api classes hirearchy,Component是Container的超类。因此,您需要使用super关键字从子类(Container)调用Parent类(Component)的构造函数。