Почему свинг отрисовывает простой компонент дважды?

Вот простой пример рисования овала.

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);
        }
    }
}

Но в режиме отладки или при добавлении информации в консоль перед отрисовкой (, как в примере ), можно увидеть, что Swing отрисовывает компоненты дважды.

paintComponent

Paint border

Paint children

paintComponent

Paint border

Paint children

Я не могу понять, почему это происходит, но я думаю, что это может повлиять на производительность в сложном графическом интерфейсе.

7
задан mKorbel 16 August 2012 в 08:07
поделиться