Java Swing은 추상 윈도우 툴킷(AWT)을 확장한 정교한 플랫폼 독립적 GUI 툴킷입니다. 버튼, 테이블, 트리 등 풍부한 위젯 세트를 제공하여 개발자가 기본 컴포넌트를 재발명하지 않고도 세련된 데스크톱 애플리케이션을 만들 수 있게 합니다.
Java Foundation Classes(JFC)의 일부인 Swing은 AWT의 핵심 기능을 기반으로 하면서 경량의 커스터마이징 가능한 컴포넌트를 제공합니다. 그 결과 룩앤필 변경, 커스텀 페인팅, 데이터 바인딩 같은 고급 UI 기능을 지원하는 프레임워크가 탄생했습니다.
이 튜토리얼에서 마스터할 내용:
Swing이 무엇이고 왜 중요한가
컨테이너 클래스와 그 역할
Java GUI 개발의 기본 개념
실전 예제와 함께하는 단계별 GUI 생성
일반적인 레이아웃 매니저와 용례
BorderLayout, FlowLayout, GridBagLayout 심층 분석
Java Swing 클래스 계층 다이어그램
모든 Swing 컴포넌트는 JComponent를 상속하며 컨테이너 클래스에 추가할 수 있습니다.
컨테이너 클래스란?
컨테이너 클래스는 모든 Swing UI의 중추로, 다른 컴포넌트를 담고 구성합니다. 최소한 하나의 컨테이너가 Swing 애플리케이션에 필요합니다. 세 가지 주요 컨테이너 유형:
JPanel – 컴포넌트 그룹화용 경량 비윈도우 컨테이너
JFrame – 타이틀 바, 테두리, 시스템 메뉴를 포함한 최상위 윈도우
JDialog – 사용자 프롬프트용 모달/모달리스 팝업 윈도우
Java에서 GUI란?
Java의 그래픽 사용자 인터페이스(GUI)는 사용자가 애플리케이션과 상호작용할 수 있는 직관적인 시각적 계층을 제공합니다. 버튼, 라벨, 텍스트 필드 등 위젯을 조립하여 내부 로직을 추상화하는 매력적인 경험을 만듭니다.
Java에서 GUI 만들기 (단계별)
기본 윈도우를 구성하고 점진적으로 컴포넌트를 추가하는 실전 연습입니다.
1단계 – 새 Java 파일 생성
다음 코드를 에디터에 복사:
import javax.swing.*;
class GuiDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("My First GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
JButton button = new JButton("Press");
frame.getContentPane().add(button);
frame.setVisible(true);
}
}
2단계 – 컴파일 및 실행
파일 저장 후 javac GuiDemo.java로 컴파일, java GuiDemo로 실행. 버튼 하나 있는 300×300 윈도우가 나타납니다.
3단계 – 다른 버튼 추가
두 번째 버튼 포함하도록 코드 수정:
import javax.swing.*;
class GuiDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("My First GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
frame.getContentPane().add(button1);
frame.getContentPane().add(button2);
frame.setVisible(true);
}
}
4단계 – 레이아웃 이슈 관찰
이제 코드 실행하면 두 버튼이 겹쳐 보입니다. JFrame의 기본 레이아웃 매니저가 BorderLayout이라 영역 지정 없이 컴포넌트 추가 시 이전 것을 대체하기 때문입니다.
Java 레이아웃 매니저
레이아웃 매니저는 컨테이너 내 컴포넌트 배치를 제어합니다. 올바른 매니저 선택은 반응형, 유지보수하기 쉬운 GUI에 필수적입니다. 가장 자주 쓰이는 매니저:
BorderLayout
FlowLayout
GridBagLayout
BoxLayout (여기선 미다룸)
BorderLayout
BorderLayout은 컨테이너를 NORTH, SOUTH, EAST, WEST, CENTER 다섯 영역으로 나눕니다. JFrame의 기본 매니저입니다.
FlowLayout
FlowLayout은 컴포넌트를 한 줄로 순차 배치하며 필요시 다음 줄로 넘깁니다. JPanel의 기본 매니저입니다.
GridBagLayout
GridBagLayout은 가장 유연하며, 컴포넌트가 여러 행/열을 차지하고 그리드 내 정확히 정렬되게 합니다.
예제: 간단한 채팅 윈도우 만들기
아래는 메뉴, 텍스트 영역, 컨트롤 패널을 결합한 응집력 있는 채팅 인터페이스를 보여주는 완전한 프로그램입니다.
해답 보기 전에 직접 코딩해 보세요.
// 메뉴, 텍스트 영역, 컨트롤을 포함한 완전한 Swing 애플리케이션
import javax.swing.*;
import java.awt.*;
class GuiDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Chat Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
// 메뉴 바
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("FILE");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(helpMenu);
JMenuItem openItem = new JMenuItem("Open");
JMenuItem saveItem = new JMenuItem("Save as");
fileMenu.add(openItem);
fileMenu.add(saveItem);
// 하단 패널 (FlowLayout 기본)
JPanel panel = new JPanel();
panel.add(new JLabel("Enter Text"));
panel.add(new JTextField(10));
panel.add(new JButton("Send"));
panel.add(new JButton("Reset"));
// 중앙 텍스트 영역
JTextArea textArea = new JTextArea();
// BorderLayout으로 프레임에 컴포넌트 추가
frame.getContentPane().add(BorderLayout.SOUTH, panel);
frame.getContentPane().add(BorderLayout.NORTH, menuBar);
frame.getContentPane().add(BorderLayout.CENTER, textArea);
frame.setVisible(true);
}
}