首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >paintComponent和super.paintComponent

paintComponent和super.paintComponent
EN

Stack Overflow用户
提问于 2015-04-20 22:44:22
回答 2查看 1.2K关注 0票数 1

我是Java的初学者。下面是两个类,一个类扩展了JComponent,需要重写paintComponent方法。另一个类扩展了JPanel,也需要重写paintComponent方法。

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

我真的很困惑。

代码语言:javascript
复制
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);

    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-04-21 00:07:12

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

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

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

在您的简单示例中,代码将正常工作,因为JComponent在默认情况下是透明的,这意味着背景是由组件的父组件绘制的。如果没有绘制整个背景,那么就有可能在特定条件下出现绘制工件(我现在不记得了)。

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

编辑:

绘制背景的标准代码是:

代码语言:javascript
复制
if (isOpaque()) 
{
    g.setColor(getBackground());
    g.fillRect(0, 0, getWidth(), getHeight());
}

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

票数 3
EN

Stack Overflow用户

发布于 2015-04-20 22:56:48

根据java -awt/swing类的层次结构,Component是Container.Therefore的超类,您需要使用super关键字从子类(容器)调用父类(组件)的构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29751063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档