paint()와 repaint() 메소드란?
- paint(): 이 메소드는 해당 컴포넌트를 실제로 그리기 위한 명령들을 담고 있습니다. Java Swing에서는 paint() 메소드가 내부적으로 paintBorder(), paintComponent(), paintChildren() 메소드를 호출하기 때문에, paint() 전체를 재정의하는 것보다 paintComponent() 메소드를 재정의하는 것이 권장됩니다. 또한 paint() 메소드는 직접 호출할 수 없으며, 대신 repaint() 메소드를 통해 간접적으로 호출해야 합니다.
- repaint(): 이 메소드는 오버라이드(재정의)할 수 없습니다. update() → paint()로 이어지는 다시 그리기 주기를 제어하는 역할을 합니다. 컴포넌트가 스스로 화면을 다시 그리도록 만들고 싶을 때 이 메소드를 호출하면 됩니다. 특히 컴포넌트의 크기 변경이 아닌 외형상의 변화만 있을 경우 repaint()를 호출하는 것이 적절합니다.
예제 코드
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class PaintRepaintTest extends JPanel implements MouseListener {
private Vector v;
public PaintRepaintTest() {
v = new Vector();
setBackground(Color.white);
addMouseListener(this);
}
public void paint(Graphics g) { // paint() 메소드
super.paint(g);
g.setColor(Color.black);
Enumeration enumeration = v.elements();
while(enumeration.hasMoreElements()) {
Point p = (Point)(enumeration.nextElement());
g.drawRect(p.x-20, p.y-20, 40, 40);
}
}
public void mousePressed(MouseEvent me) {
v.add(me.getPoint());
repaint(); // repaint() 메소드 호출
}
public void mouseClicked(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.getContentPane().add(new PaintRepaintTest());
frame.setTitle("PaintRepaint Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(375, 250);
frame.setVisible(true);
}
}위 프로그램을 실행하면 마우스로 화면을 클릭할 때마다 사각형이 그려집니다. 핵심 동작 방식은 다음과 같습니다. 사용자가 마우스를 누르면 mousePressed() 메소드가 호출되어 클릭된 좌표를 Vector에 저장한 뒤, repaint() 메소드를 호출합니다. 그러면 시스템이 자동으로 paint() 메소드를 실행하여 저장된 좌표들에 사각형을 다시 그려줍니다.
실행 결과
