为什么摆动绘制简单的组件两次?(Why does swing draw simple compone

2019-07-31 00:34发布

下面是绘制一个椭圆的简单的例子。

public class SwingPainter extends JFrame{
    public SwingPainter() {
        super("Swing Painter");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        getContentPane().add(new MySwingComponent());

        setSize(200, 200);
        setVisible(true);
    }

    public static void main(String[] args) {
        new SwingPainter();
    }

    class MySwingComponent extends JComponent {

         public void paintComponent(Graphics g) {
            System.out.println("paintComponent");
            super.paintComponent(g);
            g.setColor(Color.red);
            g.fillOval(10, 10, 50, 50);
        }

        @Override
        protected void paintBorder(Graphics g) {
            System.out.println("Paint border");
            super.paintBorder(g);
        }

        @Override
        protected void paintChildren(Graphics g) {
            System.out.println("Paint children");
            super.paintChildren(g);
        }
    }
}

但在调试模式或添加一些信息图形(如例子)前控制台,您可以看到,摆绘制组件的两倍。

的paintComponent

油漆边界

儿童漆

的paintComponent

油漆边界

儿童漆

我不明白为什么会发生,但我认为它可以在一个困难的GUI影响性能。

Answer 1:

文章附加的涂料性能:在AWT和Swing绘画不透明度提出了原因:“不透明属性允许Swing的涂料体系来检测特定组件上重新绘制请求是否会要求潜在的祖先或不附加重画。” 因为你扩展JComponentopaque属性默认为false,和优化是不可能的。 设置该属性true看出差别,以及来自不履行属性的神器。 相关的例子可以发现这里和这里 。



Answer 2:

我同意康斯坦丁,你有什么需要记住,重绘管理器响应任何数量的请求的应用程序启动时,这通常包括初始绘制请求时,所示的窗口和调整(有二)。

试试这个。 等到应用程序运行和调整窗口的大小。 我敢肯定,你会得到更多然后一对夫妇重绘请求的;)



Answer 3:

这工作没什么问题。 事实上,即使是在调试模式下输出为:

paintComponent
Paint border
Paint children

请记住,在AWT和Swing组件有很多方法(油漆,的paintBorder,paintChildren,的paintComponent,重绘等),它们通过回拨叫,每当GUI引擎找到合适的。 这可能会有所不同,从JVM到JVM或者甚至不同的执行会议。 它们也可以从互动到您的程序(如果你最小化/最大化,例如)触发。 或者,他们可能不会在所有。



文章来源: Why does swing draw simple component twice?