프로그래밍 언어/JAVA

스윙 컴포넌트 그리기

· 코딩마이데이

컴포넌트는 자신의 모양을 스스로 그린다.

모든 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