반응형
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의 안정성과 응답성을 유지하기 위해 특정 스레딩 정책을 따름
- 이벤트 디스패칭 스레드
- Swing 애플리케이션에서 모든 GUI 관련 작업을 처리하는 특별한 스레드
- 모든 swing 컴포넌트는 이벤트 디스패칭 스레드에서만 접근해야 함
- 사용자가 버튼을 클릭하는 등의 이벤트가 이 스레드에서 처리됨
- 다른 스레드에서 GUI를 수정하면 예기치 않은 동작이나 오류가 발생할 수 있음
- SwingUtilities.invokeLater()
- Runnable 객체를 인자로 받아 해당 작업을 이벤트 디스패칭 스레드에서 실행하도록 요청하는 방법
- GUI 초기화(애플리케이션이 시작될 때 사용자 인터페이스를 설정하고 구성하는 과정)와 업데이트(애플리케이션 실행 중 사용자 인터페이스의 상태나 내용을 변경하는 과정) 작업을 안전하게 처리할 수 있음
- GUI를 생성하고 표시할 때 메인 스레드에서 직접 실행하지 않고 이벤트 디스패칭 스레드로 제어를 전송하여 안전하게 작업을 수행
SwingWorker
- 긴 작업(네트워크 I/O 또는 계산)을 배경 스레드에서 수행하여 UI가 응답성을 유지하도록 돕는 클래스
- 디스패칭 스레드를 차단하지 않고도 작업을 수행할 수 있음
반응형
'JAVA > Java Platform, Standard Edition' 카테고리의 다른 글
| [공식 문서] 멀티스레딩 구현을 위한 기본 인터페이스(Runnable) (0) | 2025.02.10 |
|---|---|
| [공식 문서] JTree와 트리 구조 데이터를 위한 데이터 모델(TreeModel) (0) | 2025.02.10 |
| [공식 문서] Swing을 통한 GUI 어플리케이션 개발 : java.awt 패키지 (0) | 2025.02.03 |
| Class String (0) | 2025.01.21 |
| Log4j (0) | 2025.01.20 |