JPanel은 Java Swing에서 제공하는 경량(lightweight) 컨테이너로, 기본적으로 눈에 보이지 않는 컴포넌트입니다. JPanel의 기본 레이아웃은 FlowLayout이며, JPanel 객체를 생성한 후에는 Container 클래스로부터 상속받은 add() 메서드를 호출하여 다른 컴포넌트들을 손쉽게 추가할 수 있습니다.
paintComponent() 메서드란?
paintComponent() 메서드는 단순히 배경색을 칠하는 것 이상으로 JPanel 위에 직접 그림이나 도형을 그려야 할 때 사용됩니다. 이 메서드는 이미 JPanel 클래스 내부에 정의되어 있기 때문에, 새로운 그리기 작업을 추가하려면 반드시 @Override와 함께 super 키워드를 활용하여 기존 동작을 확장해야 합니다.
또한 이 메서드는 Graphics 객체를 매개변수로 받으며, 패널의 배경 처리를 담당하는 super.paintComponent() 호출은 반드시 메서드의 첫 번째 줄에서 실행되어야 합니다. 이를 생략하면 이전에 그렸던 잔상이 남거나 화면이 깨질 수 있습니다.
문법(Syntax)
protected void paintComponent(Graphics g)
예제 코드
아래 예제는 paintComponent()를 오버라이드하여 JPanel 위에 웃는 얼굴(스마일리)을 그리는 프로그램입니다.
import java.awt.*;
import javax.swing.*;
public class SmileyApp extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.YELLOW);
g.fillOval(10, 10, 200, 200); // 얼굴 그리기
// 눈 그리기
g.setColor(Color.BLACK);
g.fillOval(55, 65, 30, 30);
g.fillOval(135, 65, 30, 30);
// 입 그리기
g.fillOval(50, 110, 120, 60);
// 미소 표현하기
g.setColor(Color.YELLOW);
g.fillRect(50, 110, 120, 30);
g.fillOval(50, 120, 120, 40);
}
public static void main(String[] args) {
SmileyApp smiley = new SmileyApp();
JFrame app = new JFrame("Smiley App");
app.add(smiley, BorderLayout.CENTER);
app.setSize(300, 300);
app.setLocationRelativeTo(null);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true);
}
}코드 설명
- extends JPanel: JPanel을 상속받아 paintComponent()를 재정의할 수 있도록 합니다.
- g.setColor(): 그리기 작업에 사용할 색상을 지정합니다.
- g.fillOval(), g.fillRect(): 각각 타원과 사각형을 채워 그리는 메서드로, 얼굴·눈·입을 표현하는 데 사용됩니다.
- JFrame 설정: 프레임 크기 지정, 화면 중앙 배치, 종료 버튼 동작 설정 후 setVisible(true)로 화면에 출력합니다.
실행 결과(Output)
위 코드를 실행하면 노란색 원 안에 검은색 눈과 미소 짓는 입이 그려진 스마일리 얼굴이 JFrame 화면 중앙에 나타납니다.
