JAVA/Java Platform, Standard Edition

[공식 문서] Swing을 통한 GUI 어플리케이션 개발 : javax.swing 패키지

yebin0322 2025. 2. 3. 16:45
반응형

Swing

  • AWT를 기반으로 GUI를 보다 쉽게 구현할 수 있도록 도와주는 순수 자바 라이브러리
  • AWT 기반이기 때문에 AWT와 100% 호환성을 보여줌
  • Swing 컴포넌트들은 j로 시작함
  • JFrame을 통해 애플리케이션의 기본 창을 만들고, JButton, JCheckBox와 같은 컴포넌트를 사용하여 상호작용을 추가할 수 있음
  • 이벤트는 ActionListener 인터페이스를 통해 처리됨
  • 모든 GUI 작업은 이벤트 디스패칭 스레드에서 수행되어야 함
  • 긴 작업은 SwingWorker를 사용하여 배경에서 처리함으로써 UI의 응답성을 유지할 수 있음

인터페이스

  • ActionListener : 버튼 클릭과 같은 액션 이벤트를 처리하는 인터페이스. 버튼에 이벤트 리스너를 추가할 때 사용됨
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ActionListenerExample {

    public static void main(String[] args) {
        JFrame frame = new JFrame("ActionListener 예제");
        frame.setSize(300, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("클릭하세요!");
        JLabel label = new JLabel("버튼을 클릭하세요.");

        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("버튼이 클릭되었습니다!");
            }
        });

        JPanel panel = new JPanel();
        panel.add(button);
        panel.add(label);
        frame.add(panel);
        frame.setVisible(true);
    }

}

  • ListModel : JList와 같은 목록 컴포넌트의 데이터를 제공하는 모델 인터페이스
import java.awt.BorderLayout;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

public class ListModelExample {

    public static void main(String[] args) {
        JFrame frame = new JFrame("ListModel 예제");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DefaultListModel<String> listModel = new DefaultListModel<>();
        listModel.addElement("항목 1");
        listModel.addElement("항목 2");
        listModel.addElement("항목 3");
        listModel.addElement("항목 4");
        listModel.addElement("항목 5");
        listModel.addElement("항목 6");
        listModel.addElement("항목 7");
        listModel.addElement("항목 8");
        listModel.addElement("항목 9");
        listModel.addElement("항목 10");

        JList<String> list = new JList<>(listModel);
        JScrollPane scrollPane = new JScrollPane(list);

        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setVisible(true);
    }

}

  • TableModel : JTable의 데이터를 제공하는 모델 인터페이스
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableModelExample {

    public static void main(String[] args) {
        JFrame frame = new JFrame("TableModel 예제");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DefaultTableModel tableModel = new DefaultTableModel();
        tableModel.addColumn("이름");
        tableModel.addColumn("나이");

        tableModel.addRow(new Object[] { "홍길동", 25 });
        tableModel.addRow(new Object[] { "김철수", 30 });
        tableModel.addRow(new Object[] { "이영희", 28 });

        JTable table = new JTable(tableModel);
        JScrollPane scrollPane = new JScrollPane(table);

        frame.add(scrollPane);
        frame.setVisible(true);
    }

}

클래스

  • JFrame : 애플리케이션의 기본 창을 생성하는 클래스
  • JButton : 클릭 가능한 버튼을 생성하는 클래스
  • JPanel : 다른 컴포넌트를 그룹화할 수 있는 경량 컨테이너 클래스
  • JLabel : 텍스트나 이미지를 표시하는 클래스
  • JTextField : 한 줄의 텍스트 입력을 위한 필드 클래스
  • JCheckBox : 선택할 수 있는 체크박스를 생성하는 클래스
  • JComboBox : 드롭다운 목록을 제공하는 클래스
  • JTable : 데이터를 행과 열로 표시하는 테이블 컴포넌트 클래스
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class SwingComponentsExample {
    public static void main(String[] args) {
        // JFrame 생성
        JFrame frame = new JFrame("Swing Components Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        // JPanel 생성
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(8, 1));
        frame.add(panel);

        // JLabel 예시
        JLabel label = new JLabel("JLabel");
        panel.add(label);

        // JTextField 예시
        JTextField textField = new JTextField("JTextField");
        panel.add(textField);

        // JCheckBox 예시
        JCheckBox checkBox = new JCheckBox("JCheckBox");
        panel.add(checkBox);

        // JComboBox 예시
        String[] comboOptions = { "Option 1", "Option 2", "Option 3" };
        JComboBox<String> comboBox = new JComboBox<>(comboOptions);
        panel.add(comboBox);

        // JButton 예시
        JButton button = new JButton("JButton");
        button.addActionListener((ActionEvent e) -> {
            JOptionPane.showMessageDialog(frame, "Button Clicked!");
        });
        panel.add(button);

        // JTable 예시
        String[] columnNames = { "Name", "Age" };
        Object[][] data = { { "Alice", 24 }, { "Bob", 30 }, { "Charlie", 28 } };
        JTable table = new JTable(data, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);
        panel.add(scrollPane);

        // JFrame 표시
        frame.setVisible(true);
    }
}

스레딩 정책

  • 스레딩 정책 : 프로그램에서 여러 스레드가 동시에 실행될 때, 어떤 스레드가 특정 작업을 수행해야 하는지를 정의하는 규칙. JAVA Swing에서는 GUI의 안정성과 응답성을 유지하기 위해 특정 스레딩 정책을 따름
  1. 이벤트 디스패칭 스레드
  • Swing 애플리케이션에서 모든 GUI 관련 작업을 처리하는 특별한 스레드
  • 모든 swing 컴포넌트는 이벤트 디스패칭 스레드에서만 접근해야 함
  • 사용자가 버튼을 클릭하는 등의 이벤트가 이 스레드에서 처리됨
  • 다른 스레드에서 GUI를 수정하면 예기치 않은 동작이나 오류가 발생할 수 있음
  1. SwingUtilities.invokeLater()
  • Runnable 객체를 인자로 받아 해당 작업을 이벤트 디스패칭 스레드에서 실행하도록 요청하는 방법
  • GUI 초기화(애플리케이션이 시작될 때 사용자 인터페이스를 설정하고 구성하는 과정)와 업데이트(애플리케이션 실행 중 사용자 인터페이스의 상태나 내용을 변경하는 과정) 작업을 안전하게 처리할 수 있음
  • GUI를 생성하고 표시할 때 메인 스레드에서 직접 실행하지 않고 이벤트 디스패칭 스레드로 제어를 전송하여 안전하게 작업을 수행

SwingWorker

  • 긴 작업(네트워크 I/O 또는 계산)을 배경 스레드에서 수행하여 UI가 응답성을 유지하도록 돕는 클래스
  • 디스패칭 스레드를 차단하지 않고도 작업을 수행할 수 있음
반응형