자바의 GUI 프로그래밍 개요
자바에서 GUI 프로그래밍을 구현하는 방법으로 AWT와 Swing 두 가지가 있습니다. 이들은 java.awt와 javax.swing 패키지에서 제공되며, 각기 다른 특성을 가지고 있습니다.
1. AWT와 Swing 패키지의 차이점
AWT (Abstract Windowing Toolkit)
- 특징: 자바 초창기부터 존재한 GUI 라이브러리로, 운영체제의 네이티브 GUI를 사용하여 컴포넌트를 표시하는 중량 컴포넌트(Heavyweight Components)입니다. 즉, 각 운영체제의 GUI에 맞추어 동작하므로 운영체제의 영향을 받습니다.
- 장점: 운영체제의 지원을 받기 때문에 처리 속도가 빠르지만, 플랫폼마다 컴포넌트의 모양과 동작이 다를 수 있습니다.
- 사용 패키지: java.awt
Swing
- 특징: 순수 자바로 작성된 GUI 라이브러리로, AWT보다 풍부하고 다양한 컴포넌트를 제공합니다. 운영체제에 의존하지 않는 경량 컴포넌트(Lightweight Components)로, 자바만으로 완전히 동일한 GUI를 구현할 수 있습니다.
- 장점: AWT에 비해 사용 가능한 GUI 컴포넌트가 많고, 운영체제와 독립적으로 작동하여 일관된 사용자 경험을 제공합니다.
- 사용 패키지: javax.swing
2. 주요 Swing 컴포넌트
Swing 컴포넌트는 대부분 이름 앞에 J가 붙으며, 다양한 UI 요소를 제공합니다. 여기서는 자주 사용되는 컴포넌트를 소개하겠습니다.
- JButton: 버튼을 생성하는 컴포넌트.
- JCheckBox: 선택을 위한 체크박스 컴포넌트.
- JComboBox: 드롭다운 목록을 표시하는 콤보박스 컴포넌트.
- JLabel: 텍스트 또는 이미지 레이블을 표시하는 컴포넌트.
- JTextField: 사용자로부터 단일 행의 텍스트 입력을 받는 컴포넌트.
- JTextArea: 다중 행 텍스트 입력 필드.
- JList: 여러 개의 항목을 표시하는 리스트 컴포넌트.
- JPanel: GUI 요소를 그룹화하는 패널 컴포넌트.
- JFrame: 최상위 GUI 윈도우를 생성하는 프레임 컴포넌트. 모든 컴포넌트를 담을 수 있는 기본적인 컨테이너 역할을 합니다.
이 외에도 JTable, JSlider, JProgressBar 등 다양한 컴포넌트들이 있어 사용자 인터페이스를 더욱 풍부하게 구성할 수 있습니다.
3. Swing GUI 프로그램 작성 절차
자바에서 GUI 프로그램을 작성하는 기본 절차는 다음과 같습니다.
Step 1: 스윙 프레임 생성
모든 GUI 요소를 담을 프레임(JFrame)을 생성합니다. 이 프레임은 모든 컴포넌트가 부착될 기본 틀입니다.
import javax.swing.*;
public class MyFrame extends JFrame {
public MyFrame() {
setTitle("My Swing Frame");
setSize(400, 300); // 프레임 크기 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 종료 동작 설정
setVisible(true); // 프레임을 화면에 표시
}
public static void main(String[] args) {
new MyFrame();
}
}
Step 2: 컴포넌트 추가
JButton, JLabel 등의 컴포넌트를 생성한 후, 프레임에 추가합니다.
JButton button = new JButton("Click Me");
getContentPane().add(button);
4. 주요 레이아웃 매니저
자바 GUI에서 레이아웃 매니저는 컴포넌트의 위치와 크기를 관리하는 역할을 합니다. 각 컨테이너에는 하나의 레이아웃 매니저가 있으며, 자주 사용되는 레이아웃 매니저는 다음과 같습니다.
FlowLayout
- 기본 특징: 컴포넌트를 왼쪽에서 오른쪽, 위에서 아래로 순서대로 배치합니다.
- 생성 및 설정: 기본적으로 컴포넌트를 중앙 정렬하며, FlowLayout.LEFT 또는 FlowLayout.RIGHT를 통해 정렬 위치를 설정할 수 있습니다.
Container c = getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));
c.add(new JButton("Button 1"));
c.add(new JButton("Button 2"));
BorderLayout
- 기본 특징: 컨테이너를 동(EAST), 서(WEST), 남(SOUTH), 북(NORTH), 중앙(CENTER)으로 나누어 각 위치에 컴포넌트를 배치합니다.
- 사용 예시:
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(new JButton("North"), BorderLayout.NORTH);
c.add(new JButton("South"), BorderLayout.SOUTH);
c.add(new JButton("East"), BorderLayout.EAST);
c.add(new JButton("West"), BorderLayout.WEST);
c.add(new JButton("Center"), BorderLayout.CENTER);
GridLayout
- 기본 특징: 컨테이너를 격자로 분할하여 각 셀에 컴포넌트를 배치합니다. 행(row)과 열(column)의 개수를 지정할 수 있으며, 컨테이너 크기가 변하면 모든 셀 크기도 자동으로 조정됩니다.
- 사용 예시:
Container c = getContentPane();
c.setLayout(new GridLayout(2, 3)); // 2행 3열로 구성
c.add(new JButton("1"));
c.add(new JButton("2"));
c.add(new JButton("3"));
c.add(new JButton("4"));
c.add(new JButton("5"));
c.add(new JButton("6"));
5. 배치 관리자 없는 레이아웃
특정 위치와 크기를 정밀하게 설정하고 싶을 때 배치 관리자를 제거하고 절대 위치와 크기를 지정할 수 있습니다. setLayout(null)로 배치 관리자를 제거한 후, setBounds(x, y, width, height) 메소드로 각 컴포넌트의 위치와 크기를 조절합니다.
Container c = getContentPane();
c.setLayout(null); // 배치 관리자 제거
JLabel label = new JLabel("Positioned Label");
label.setBounds(50, 50, 100, 30); // 위치 (50,50) 크기 (100,30)
c.add(label);
이 방법은 위치와 크기를 직접 설정할 수 있으나, 화면 크기나 해상도가 변할 때 자동으로 조정되지 않기 때문에 유연성이 낮습니다.
6. 예제: 다양한 컴포넌트를 배치한 GUI 만들기
다양한 레이아웃 매니저와 컴포넌트를 조합하여 GUI 프로그램을 제작할 수 있습니다.
import javax.swing.*;
import java.awt.*;
public class MultiplePanelEx extends JFrame {
public MultiplePanelEx() {
setTitle("Multiple Panels and Layouts");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
// 컨텐트팬 레이아웃 설정
Container c = getContentPane();
c.setLayout(new BorderLayout());
// 상단 패널 (FlowLayout 사용)
JPanel northPanel = new JPanel();
northPanel.setLayout(new FlowLayout());
northPanel.add(new JButton("Open"));
northPanel.add(new JButton("Save"));
northPanel.add(new JButton("Close"));
c.add(northPanel, BorderLayout.NORTH);
// 중앙 패널 (GridLayout 사용)
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new GridLayout(2, 2));
centerPanel.add(new JLabel("Name:"));
centerPanel.add(new JTextField());
centerPanel.add(new JLabel("ID:"));
centerPanel.add(new JTextField());
c.add(centerPanel, BorderLayout.CENTER);
setVisible(true);
}
public static void main(String[] args) {
new MultiplePanelEx();
}
}
결론
자바의 GUI 프로그래밍은 AWT와 Swing을 통해 강력한 그래픽 인터페이스를 제공합니다. 다양한 레이아웃 매니저와 컴포넌트를 활용하여 유연하고 직관적인 인터페이스를 쉽게 구성할 수 있습니다. JFrame을 통해 기본 틀을 만들고, 레이아웃 매니저로 컴포넌트의 위치를 정렬해보며 다양한 GUI 프로그램을 개발해보세요.