스윙 컴포넌트 그리기
컴포넌트는 자신의 모양을 스스로 그린다.
모든 GUI 플랫폼에서 그리기(painting)의 기본은 GUI 컴포넌트가 스스로 그린다는 점입니다. 자바의 스윙도 마찬가지이며, 각 스윙 GUI 컴포넌트는 자신의 모양을 그리는 메서드를 가지고 있습니다. 이제, 스윙에서 각 컴포넌트가 자신의 모양을 그리는 paintComponent() 메서드에 대해 알아봅시다.
paintComponent()
모든 스윙 컴포넌트가 가지고 있는 메서드로서, 스윙 컴포넌트가 자신의 내부를 그리는 paintCompontent() 메서드의 원형은 다음과 같습니다,
void paintComponent(Graphics g) // 컴포넌트의 내부 모양을 그립니다.
또한 paintComponent()는 JComponent의 추상 메소드이므로 모든 스윙 컴포넌트가 오버라이딩하여 가지고 있다. 그리고 스윙 컴포넌트에 paintComponent()가 호출되는 경우는 아래와 같다.
- 컴포넌트의 크기나 위치 변경 등 컴포넌트에 변화가 생길 때
- 다른 윈도우에 의해 가려졌다가 드러날 때
- 아이콘화되었다가 본래 크기로 복구할 때
- 응용프로그램이 컴포넌트의 repaint() 메소드를 호출하여 강제로 다시 그릴 때
paintComponent()의 오버라이딩
개발자가 JCompontent를 상속받아 새로운 컴포넌트를 설계하든지 아니먄 기존의 스윙 컴포넌트의 모양을 다르게 그리고자 할 때, 다음과 같이 painComponent()를 오버라이딩하여 자신의 컴포넌트 모양을 그릴 수 있습니다.

JPanel에 그리기
JPanel은 빈 캠퍼스와 같이 아무 모양도 없는 빈 컨테이너로서, 다양한 GUI를 창출할 수 있는 캔버스로 적합하기 때문에 그래픽을 위해 많이 사용됩니다. JPanel 클래스를 상속받고 paintComponent()를 오버라이딩히여 이곳에 그리기를 구현합니다.
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g); // JPanel의 paintComponent() 호출
g.setColor(Color.BLUE); // 파란색 선택
g.drawRect(10,10,50,50); // (10,10) 위치에 50x50 크기의 사각형 그리기
g.drawRect(60,70,50,50); // (60,70) 위치에 50x50 크기의 사각형 그리기
g.drawRect(110,130,50,50); // (110,130) 위치에 50x50 크기의 사각형 그리기
}
}
이 코드에서는 다음 라인은 paintComponent(Graphics g)의 인자로 넘어오는 Graphic 객체 g의 파란색을 지정합니다.
g.setColor(Color.BLUE); // 파란색 선택
또한 디음 코드는 JPanel 상의 (10,10) 위치에 50 x 50 크기의 파란색 시각형으로 그립니다.
d.drawRect(10, 10, 50, 50); // (10, 10) 위치에 50x50 크기의 시각형 그리기
JPanel에 이미 작성되어 있는 paintComponent()는 JPanel에 그려진 내용을 모두 지우고, setBackground()에 의해 지정된 배경색으로 바탕을 칠하도록 만들어져 있습니다.
super.paintComponent(g); // JPanel에 구혀된 paintComponent() 호출
JPanel을 상속받아 paintComponent()를 작성하는 경우 super.paintComponent()를 먼저 호출하는 것이 일반적입니다.
JPanel을 상속받아 도형 그리기
import javax.swing.*;
import java.awt.*;
public class paintJPanelEx extends JFrame {
private MyPanel panel = new MyPanel();
public paintJPanelEx() {
setTitle("JPanel의 paintComponent() 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(panel); // 생성한 panel 패널을 컨텐트팬으로 사용
setSize(230,250);
setVisible(true);
}
// JPanel을 상속받는 새 패널 구현
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g); // JPanel의 paintComponent() 호출
g.setColor(Color.BLUE); // 파란색 선택
g.drawRect(10, 10, 50, 50); // (10,10) 위치에 50x50 크기의 사각형 그리기
g.drawRect(50, 50, 50, 50); // (50, 50) 위치에 50x50 크기의 사각형 그리기
g.setColor(Color.MAGENTA); // 마젠타색 선택
g.drawRect(90, 90, 50, 50); // (90, 90) 위치에 50x50 크기의 사각형 그리기
}
}
public static void main(String[] args) {
new paintJPanelEx();
}
}
[실행결과]

'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| 도형 그리기와 칠하기 (1) | 2025.07.24 |
|---|---|
| Graphics (2) | 2025.07.21 |
| JSlider, 슬라이더 컴포넌트 (2) | 2025.07.15 |
| JComboBox<E>, 콤보박스 컴포넌트 (6) | 2025.07.12 |
| JList<E>, 리스트 컴포넌트 (3) | 2025.07.10 |