java - paintComponent 和 super.paintComponent

标签 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);

    }
}

最佳答案

通过调用 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() 方法的开头添加此代码即可。

关于java - paintComponent 和 super.paintComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29751063/

相关文章:

java - 用 JFrame 中的 JPanel 替换 JPanel

java - Tomcat 两个项目相互通信

java - Amazon DynamoDB 中的 MAX 操作

java - 如何对齐 JtextPane 或 StringBuffer 中的文本

java - 如何在 JPanel 中创建矩形 block ?

java - KeyListener 不会监听 JPanel

java - TestNG Dataprovider - 过滤测试数据

java - 防止/使其未经授权用户更改“设置”中的时间

java - 在 Java 中从 GUI 添加数据

java - 实时更改 Swing GUI 默认外观