명품 자바 프로그래밍

[명품 자바 프로그래밍] 9장 자바 GUI 프로그래밍 기초, 자바 기본 패키지 정리

n_0_jun 2024. 12. 3. 14:00
반응형

 

자바의 GUI 프로그래밍 개요

자바에서 GUI 프로그래밍을 구현하는 방법으로 AWTSwing 두 가지가 있습니다. 이들은 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 프로그램을 개발해보세요.

반응형