Вот простой пример рисования овала.
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
Я не могу понять, почему это происходит, но я думаю, что это может повлиять на производительность в сложном графическом интерфейсе.