add user agent parser and update build configuration

This commit is contained in:
2025-03-11 11:32:36 +09:00
parent 3db3499d30
commit 09731f464d
47 changed files with 8825 additions and 18 deletions

View File

@@ -0,0 +1,59 @@
다음은 **Swing의 모든 주요 컴포넌트**를 정리한 표이다.
### **1. 기본 컴포넌트**
| 컴포넌트 | 설명 |
|----------|---------------------------------------------|
| `JLabel` | 텍스트 또는 아이콘을 표시하는 레이블 |
| `JButton` | 클릭 가능한 버튼 |
| `JToggleButton` | ON/OFF 상태를 가질 수 있는 버튼 |
| `JCheckBox` | 다중 선택이 가능한 체크박스 |
| `JRadioButton` | 단일 선택이 가능한 라디오 버튼 |
| `JTextField` | 한 줄의 텍스트 입력 필드 |
| `JPasswordField` | 비밀번호 입력 필드 (입력값이 가려짐) |
| `JTextArea` | 여러 줄의 텍스트를 입력할 수 있는 영역 |
| `JEditorPane` | HTML, RTF 등을 표시할 수 있는 편집 가능한 텍스트 영역 |
| `JComboBox` | 드롭다운 목록을 제공하는 콤보 박스 |
| `JList` | 여러 개의 아이템을 선택할 수 있는 리스트 |
### **2. 컨테이너 컴포넌트**
| 컴포넌트 | 설명 |
|----------|---------------------------------------------|
| `JPanel` | 기본 컨테이너 패널 |
| `JScrollPane` | 내부 컴포넌트에 스크롤 기능을 추가 |
| `JSplitPane` | 두 개의 컴포넌트를 수평/수직으로 나눌 수 있는 패널 |
| `JTabbedPane` | 여러 개의 탭을 제공하는 패널 |
| `JLayeredPane` | 컴포넌트들을 여러 레이어로 배치할 수 있는 패널 |
| `JDesktopPane` | MDI(Multiple Document Interface)를 위한 내부 프레임 지원 패널 |
### **3. 고급 컴포넌트**
| 컴포넌트 | 설명 |
|----------|---------------------------------------------|
| `JTable` | 데이터를 표 형태로 표시하는 테이블 |
| `JTree` | 계층 구조를 표시하는 트리 |
| `JProgressBar` | 작업 진행 상태를 표시하는 프로그레스 바 |
| `JSlider` | 슬라이더를 통한 값 조정 가능 |
| `JSpinner` | 숫자 또는 값 목록을 조정할 수 있는 스피너 |
### **4. 메뉴 및 다이얼로그**
| 컴포넌트 | 설명 |
|----------|---------------------------------------------|
| `JMenuBar` | 메뉴바를 제공하는 컨테이너 |
| `JMenu` | 메뉴 항목을 포함하는 메뉴 |
| `JMenuItem` | 개별적인 메뉴 항목 |
| `JCheckBoxMenuItem` | 체크 가능한 메뉴 항목 |
| `JRadioButtonMenuItem` | 라디오 버튼 형태의 메뉴 항목 |
| `JPopupMenu` | 우클릭 팝업 메뉴 |
| `JToolBar` | 도구 모음(툴바) 패널 |
| `JOptionPane` | 알림, 확인, 입력을 위한 다이얼로그 제공 |
| `JFileChooser` | 파일 선택 다이얼로그 |
| `JColorChooser` | 색상 선택 다이얼로그 |
### **5. 윈도우 관련 컴포넌트**
| 컴포넌트 | 설명 |
|----------|---------------------------------------------|
| `JFrame` | 기본 윈도우 프레임 |
| `JDialog` | 모달 또는 모델리스 다이얼로그 창 |
| `JWindow` | 테두리 없는 창 |
| `JInternalFrame` | `JDesktopPane` 내에서 사용할 수 있는 내부 프레임 |
위 컴포넌트들을 조합하면 다양한 GUI 애플리케이션을 만들 수 있다.

View File

@@ -0,0 +1,190 @@
# **ActionListener와 ActionCommand 사용법**
`ActionListener`는 버튼 클릭, 메뉴 항목 선택 등 사용자 입력에 대한 동작을 처리하는 인터페이스입니다.
`ActionCommand`는 특정 이벤트를 식별하는 문자열로, `ActionListener`가 어떤 동작을 수행해야 하는지 구분하는 데 사용됩니다.
---
## **1. ActionListener 기본 사용법**
`ActionListener`를 사용하려면 `ActionListener` 인터페이스를 구현한 후 `actionPerformed()` 메서드를 오버라이드해야 합니다.
### **(1) 버튼 클릭 이벤트 처리 예제**
```java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionListenerExample {
public static void main(String[] args) {
JFrame frame = new JFrame("ActionListener Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JButton button = new JButton("클릭하세요");
// ActionListener 추가
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "버튼이 클릭되었습니다!");
}
});
panel.add(button);
frame.add(panel);
frame.setVisible(true);
}
}
```
### **설명**
1. `JButton`을 생성하고 `"클릭하세요"` 라벨을 설정.
2. `button.addActionListener()`를 사용하여 `ActionListener` 추가.
3. 버튼을 클릭하면 `actionPerformed()`가 호출되어 메시지 창이 표시됨.
---
## **2. ActionCommand 활용하기**
기본적으로 버튼의 텍스트가 `ActionCommand`로 설정되지만, 직접 지정할 수도 있습니다.
### **(1) 여러 버튼을 구분하는 예제**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionCommandExample {
public static void main(String[] args) {
JFrame frame = new JFrame("ActionCommand Example");
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton btn1 = new JButton("버튼 1");
JButton btn2 = new JButton("버튼 2");
// ActionCommand 설정
btn1.setActionCommand("BUTTON_ONE");
btn2.setActionCommand("BUTTON_TWO");
// 공통 ActionListener
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if ("BUTTON_ONE".equals(command)) {
JOptionPane.showMessageDialog(null, "버튼 1이 클릭됨!");
} else if ("BUTTON_TWO".equals(command)) {
JOptionPane.showMessageDialog(null, "버튼 2가 클릭됨!");
}
}
};
btn1.addActionListener(listener);
btn2.addActionListener(listener);
frame.add(btn1);
frame.add(btn2);
frame.setVisible(true);
}
}
```
### **설명**
1. 두 개의 버튼(`btn1`, `btn2`)을 생성.
2. `setActionCommand("BUTTON_ONE")``setActionCommand("BUTTON_TWO")`로 명령어 설정.
3. **하나의 `ActionListener`** 에서 `e.getActionCommand()`를 사용하여 어떤 버튼이 눌렸는지 판별.
---
## **3. 별도의 ActionListener 클래스로 분리하기**
코드를 깔끔하게 유지하려면 `ActionListener`를 별도의 클래스로 분리하는 것이 좋습니다.
```java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "이벤트가 발생했습니다! (" + e.getActionCommand() + ")");
}
}
public class SeparateActionListenerExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Separate ActionListener Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JButton button = new JButton("클릭");
button.setActionCommand("CLICK_BUTTON");
// 별도의 클래스 사용
button.addActionListener(new MyActionListener());
panel.add(button);
frame.add(panel);
frame.setVisible(true);
}
}
```
### **설명**
- `MyActionListener` 클래스를 만들어 `ActionListener`를 구현.
- `JButton``MyActionListener`를 추가.
- 클릭하면 `"이벤트가 발생했습니다! (CLICK_BUTTON)"` 메시지를 표시.
---
## **4. Lambda 표현식 사용**
Java 8 이상에서는 람다를 사용하여 `ActionListener`를 더 간결하게 작성할 수 있습니다.
```java
import javax.swing.*;
public class LambdaActionListenerExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Lambda ActionListener");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JButton button = new JButton("눌러보세요");
// Lambda 표현식 사용
button.addActionListener(e -> JOptionPane.showMessageDialog(null, "람다식으로 처리된 이벤트!"));
panel.add(button);
frame.add(panel);
frame.setVisible(true);
}
}
```
### **설명**
- `ActionListener`를 람다 표현식(`e -> { }`)으로 간단하게 구현.
- 코드가 더 짧고 가독성이 좋아짐.
---
## **5. 총정리**
| 개념 | 설명 |
|------|------------------------------------------------|
| `ActionListener` | 버튼, 메뉴 항목 등의 액션 이벤트를 처리하는 인터페이스 |
| `actionPerformed(ActionEvent e)` | 버튼 클릭 등 액션이 발생하면 호출됨 |
| `setActionCommand(String command)` | 특정 동작을 식별하기 위한 명령어 설정 |
| `getActionCommand()` | 이벤트 발생 시 설정된 `ActionCommand` 값 가져오기 |
| **구현 방식** | - **익명 클래스** (`new ActionListener() {}`) 사용<br>- **별도 클래스** 구현<br>- **람다 표현식** (`e -> { }`) 사용 |
---
## **6. 어떤 방식을 사용할까?**
- **버튼 수가 적다면?** → `익명 클래스` 또는 `람다 표현식`
- **여러 개의 버튼을 한 곳에서 처리해야 한다면?** → `ActionCommand` 활용
- **큰 프로젝트에서 여러 UI 요소가 같은 이벤트를 공유해야 한다면?** → `별도 클래스``ActionListener` 분리
위 내용을 이해하면 버튼 클릭뿐만 아니라 메뉴 항목 선택, 키보드 단축키 처리 등 다양한 Swing 이벤트 처리에 활용할 수 있습니다.

View File

@@ -0,0 +1,166 @@
# **Swing의 `JComboBox`, `JList` 및 관련 클래스 정리**
## **1. 주요 메서드 정리**
### **(1) `JComboBox` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `addItem(E item)` | 콤보박스에 항목 추가 |
| `removeItem(Object item)` | 특정 항목 제거 |
| `removeItemAt(int index)` | 지정한 인덱스의 항목 제거 |
| `removeAllItems()` | 모든 항목 제거 |
| `setSelectedItem(Object item)` | 특정 항목을 선택 상태로 설정 |
| `getSelectedItem()` | 현재 선택된 항목 반환 |
| `setSelectedIndex(int index)` | 특정 인덱스를 선택 상태로 설정 |
| `getSelectedIndex()` | 현재 선택된 항목의 인덱스 반환 |
| `setEditable(boolean b)` | 콤보박스를 편집 가능하도록 설정 |
| `isEditable()` | 편집 가능 여부 확인 |
| `addActionListener(ActionListener l)` | 항목 선택 시 이벤트 리스너 추가 |
| `addItemListener(ItemListener l)` | 아이템이 선택 또는 변경될 때 이벤트 리스너 추가 |
---
### **(2) `JList` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setListData(E[] listData)` | 리스트 데이터를 설정 |
| `getSelectedValue()` | 현재 선택된 값 반환 |
| `getSelectedValuesList()` | 여러 개의 선택된 값 리스트 반환 |
| `setSelectedIndex(int index)` | 특정 인덱스를 선택 |
| `setSelectedIndices(int[] indices)` | 여러 개의 항목을 선택 |
| `getSelectedIndex()` | 현재 선택된 인덱스 반환 |
| `getSelectedIndices()` | 선택된 인덱스 배열 반환 |
| `setSelectionMode(int mode)` | 선택 모드 설정 (`SINGLE_SELECTION`, `MULTIPLE_INTERVAL_SELECTION` 등) |
| `addListSelectionListener(ListSelectionListener l)` | 항목 선택 변경 시 이벤트 리스너 추가 |
---
### **(3) `DefaultComboBoxModel<E>` (콤보박스 데이터 모델)**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `addElement(E item)` | 모델에 항목 추가 |
| `insertElementAt(E item, int index)` | 특정 위치에 항목 삽입 |
| `removeElement(E obj)` | 특정 항목 제거 |
| `removeElementAt(int index)` | 특정 인덱스의 항목 제거 |
| `getElementAt(int index)` | 특정 인덱스의 항목 가져오기 |
| `getSize()` | 항목 개수 반환 |
---
### **(4) `DefaultListModel<E>` (리스트 데이터 모델)**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `addElement(E item)` | 리스트에 항목 추가 |
| `insertElementAt(E item, int index)` | 특정 위치에 항목 삽입 |
| `removeElement(E obj)` | 특정 항목 제거 |
| `removeElementAt(int index)` | 특정 인덱스의 항목 제거 |
| `getElementAt(int index)` | 특정 인덱스의 항목 가져오기 |
| `getSize()` | 항목 개수 반환 |
---
## **2. 관련 이벤트 정리**
| 이벤트 리스너 | 관련 컴포넌트 | 설명 |
|--------------|-------------|----------------------------------|
| `ActionListener` | `JComboBox` | 콤보박스에서 항목이 선택될 때 발생 |
| `ItemListener` | `JComboBox`, `JList` | 항목이 선택되거나 해제될 때 발생 |
| `ListSelectionListener` | `JList` | 리스트의 선택 항목이 변경될 때 발생 |
| `MouseListener` | `JList` | 리스트 항목을 마우스로 클릭할 때 발생 |
---
## **3. 예제 코드 및 설명**
### **(1) `JComboBox` 예제 항목 선택 시 라벨에 출력**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JComboBoxExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JComboBox Example");
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JLabel label = new JLabel("선택된 항목: ");
JComboBox<String> comboBox = new JComboBox<>(new String[]{"사과", "바나나", "체리"});
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("선택된 항목: " + comboBox.getSelectedItem());
}
});
frame.add(comboBox);
frame.add(label);
frame.setVisible(true);
}
}
```
**설명:**
- `JComboBox`에 "사과", "바나나", "체리" 항목을 추가.
- 사용자가 선택하면 `ActionListener`가 실행되어 선택된 항목을 `JLabel`에 출력.
---
### **(2) `JList` 예제 여러 개 항목 선택 가능**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class JListExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JList Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement("Java");
listModel.addElement("Python");
listModel.addElement("C++");
listModel.addElement("JavaScript");
JList<String> list = new JList<>(listModel);
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
JScrollPane scrollPane = new JScrollPane(list);
JButton button = new JButton("선택 확인");
JLabel label = new JLabel("선택된 항목: ");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
List<String> selectedValues = list.getSelectedValuesList();
label.setText("선택된 항목: " + selectedValues);
}
});
frame.add(scrollPane, BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.add(label, BorderLayout.NORTH);
frame.setVisible(true);
}
}
```
**설명:**
- `JList`에 "Java", "Python", "C++", "JavaScript" 항목 추가.
- 여러 개의 항목을 선택할 수 있도록 `setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)` 설정.
- 버튼을 누르면 선택된 항목이 `JLabel`에 출력됨.
---
## **4. 총정리**
- **`JComboBox`**: 드롭다운 목록에서 하나의 항목 선택 가능. `ActionListener``ItemListener`를 사용하여 선택 이벤트 처리.
- **`JList`**: 여러 개의 항목을 리스트 형태로 표시. 선택 모드 설정 가능 (`SINGLE_SELECTION`, `MULTIPLE_INTERVAL_SELECTION`).
- **`DefaultComboBoxModel`, `DefaultListModel`**: 동적으로 항목을 추가/삭제할 수 있는 모델 제공.
- **관련 이벤트**: `ActionListener` (콤보박스 선택 이벤트), `ListSelectionListener` (리스트 선택 변경 감지).
위 내용을 바탕으로 다양한 UI 요소를 조합하여 인터랙티브한 프로그램을 만들 수 있다!

177
docs/swing/JEditorPane.md Normal file
View File

@@ -0,0 +1,177 @@
# **Swing의 `JEditorPane` 및 `EditorKit` 정리**
## **1. 주요 메서드 정리**
### **(1) `JEditorPane` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setContentType(String type)` | 문서의 MIME 타입 설정 (`text/plain`, `text/html`, `text/rtf` 등) |
| `getContentType()` | 현재 설정된 콘텐츠 타입 반환 |
| `setText(String text)` | 편집기에 텍스트 설정 |
| `getText()` | 현재 편집기의 텍스트 반환 |
| `setPage(String url)` | 지정된 URL의 내용을 로드하여 표시 |
| `setPage(URL url)` | `URL` 객체를 이용하여 페이지 로드 |
| `read(Reader in, Object desc)` | 입력 스트림을 이용하여 문서 로드 |
| `write(Writer out)` | 현재 내용을 출력 스트림에 저장 |
| `setEditable(boolean b)` | 편집 가능 여부 설정 |
| `isEditable()` | 편집 가능 여부 확인 |
| `setEditorKit(EditorKit kit)` | 특정 `EditorKit`을 사용하여 편집 동작 변경 |
| `getEditorKit()` | 현재 사용 중인 `EditorKit` 반환 |
| `replaceSelection(String content)` | 현재 선택된 텍스트를 새 텍스트로 대체 |
| `getSelectedText()` | 현재 선택된 텍스트 반환 |
| `addHyperlinkListener(HyperlinkListener l)` | 하이퍼링크 이벤트 리스너 추가 |
---
### **(2) `EditorKit` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `createDefaultDocument()` | 새 기본 문서 생성 |
| `read(Reader in, Document doc, int pos)` | 주어진 리더(`Reader`)에서 문서를 읽어옴 |
| `write(Writer out, Document doc, int pos, int len)` | 문서를 지정된 범위 내에서 출력 스트림으로 저장 |
| `install(JEditorPane c)` | 특정 `JEditorPane``EditorKit`을 설치 |
| `deinstall(JEditorPane c)` | `JEditorPane`에서 `EditorKit`을 제거 |
| `getViewFactory()` | 문서의 뷰를 생성하는 `ViewFactory` 반환 |
---
## **2. 관련 이벤트 정리**
| 이벤트 리스너 | 관련 컴포넌트 | 설명 |
|--------------|-------------|----------------------------------|
| `HyperlinkListener` | `JEditorPane` | HTML 문서에서 하이퍼링크 클릭 시 발생 |
| `DocumentListener` | `JEditorPane` | 문서의 변경(삽입, 삭제 등)이 발생할 때 감지 |
| `CaretListener` | `JEditorPane` | 커서(캐럿) 위치가 변경될 때 발생 |
| `KeyListener` | `JEditorPane` | 키보드 입력을 감지 |
---
## **3. 예제 코드 및 설명**
### **(1) 기본적인 `JEditorPane` 사용**
```java
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
public class JEditorPaneExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JEditorPane Example");
frame.setSize(500, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/plain");
editorPane.setText("여기에 텍스트를 입력하세요.");
editorPane.setEditable(true);
JScrollPane scrollPane = new JScrollPane(editorPane);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setVisible(true);
}
}
```
**설명:**
- `JEditorPane`을 생성하고 `setContentType("text/plain")`을 설정하여 일반 텍스트를 편집할 수 있도록 함.
- `setEditable(true)`로 설정하여 편집 가능하도록 함.
- `JScrollPane`을 사용하여 스크롤 가능하도록 추가.
---
### **(2) HTML 문서 표시 및 하이퍼링크 이벤트 처리**
```java
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.awt.*;
import java.io.IOException;
public class JEditorPaneHyperlinkExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JEditorPane - HTML Example");
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setText("<html><body>"
+ "<h1>HTML 지원</h1>"
+ "<p>이것은 <b>HTML</b> 형식의 문서입니다.</p>"
+ "<a href='https://www.example.com'>이 링크를 클릭하세요</a>"
+ "</body></html>");
editorPane.setEditable(false);
// 하이퍼링크 이벤트 처리
editorPane.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
try {
editorPane.setPage(e.getURL()); // 링크 클릭 시 해당 페이지 로드
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
JScrollPane scrollPane = new JScrollPane(editorPane);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setVisible(true);
}
}
```
**설명:**
- `JEditorPane`을 생성하고 `setContentType("text/html")`을 설정하여 HTML을 표시할 수 있도록 함.
- `addHyperlinkListener()`를 이용해 하이퍼링크 클릭 시 이벤트를 감지하여 `setPage(e.getURL())`로 페이지를 로드하도록 함.
- `setEditable(false)`로 설정하여 사용자가 직접 편집하지 못하도록 함.
---
### **(3) `EditorKit`을 활용한 RTF 문서 편집**
```java
import javax.swing.*;
import javax.swing.text.rtf.RTFEditorKit;
import java.awt.*;
public class JEditorPaneRTFExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JEditorPane - RTF Example");
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JEditorPane editorPane = new JEditorPane();
editorPane.setEditorKit(new RTFEditorKit()); // RTF 전용 EditorKit 설정
editorPane.setText("{\\rtf1\\ansi This is RTF formatted text.}");
JScrollPane scrollPane = new JScrollPane(editorPane);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setVisible(true);
}
}
```
**설명:**
- `RTFEditorKit`을 사용하여 RTF(리치 텍스트 포맷) 문서를 편집할 수 있도록 설정.
- `setEditorKit(new RTFEditorKit())`을 통해 `JEditorPane`에 적용.
- RTF 포맷의 기본 문서를 설정하여 편집 가능하도록 함.
---
## **4. 총정리**
- **`JEditorPane`**: `JTextPane`과 유사하지만 HTML, RTF, 일반 텍스트 등 다양한 문서 형식을 지원.
- **`EditorKit`**: 특정 문서 포맷을 편집할 수 있도록 지원하는 클래스 (`RTFEditorKit`, `HTMLEditorKit` 등).
- **이벤트 처리**:
- `HyperlinkListener` → HTML 문서에서 링크 클릭 감지.
- `DocumentListener` → 문서 변경 감지.
- `CaretListener` → 커서 이동 감지.
- **활용 예제**:
- 일반 텍스트 편집기
- HTML 문서 뷰어 및 하이퍼링크 처리
- RTF 문서 편집기
위 내용을 활용하면 웹 기반 문서 편집기나 간단한 브라우저 기능을 구현할 수도 있다!

69
docs/swing/README.md Normal file
View File

@@ -0,0 +1,69 @@
다음은 실무 위주의 **자바 Swing** 책 목차 초안이다.
---
# **실무에서 바로 쓰는 자바 Swing**
## **1. 개요 및 환경 설정**
1.1. Swing이란? (AWT와의 차이)
1.2. JavaFX와 비교: 언제 Swing을 선택할까?
1.3. JDK 설치 및 개발 환경 설정
1.4. IntelliJ IDEA와 Eclipse에서 Swing 프로젝트 생성
## **2. Swing의 기본 구성 요소**
2.1. JFrame과 창 다루기
2.2. JPanel과 레이아웃 기본
2.3. JLabel, JButton, JTextField의 활용
2.4. 이벤트 리스너 개념 및 적용
## **3. 레이아웃 매니저 활용**
3.1. FlowLayout, BorderLayout, GridLayout
3.2. BoxLayout, CardLayout, GridBagLayout
3.3. 사용자 정의 레이아웃 적용하기
3.4. 레이아웃 없이 직접 컴포넌트 배치하기
## **4. 고급 컴포넌트 활용**
4.1. JTable을 활용한 데이터 표시
4.2. JTree를 활용한 계층 구조 표현
4.3. JList와 JComboBox의 활용
4.4. JTabbedPane, JSplitPane을 활용한 UI 구성
## **5. 이벤트 처리 심화**
5.1. ActionListener, MouseListener, KeyListener
5.2. 익명 클래스와 람다 표현식 활용
5.3. Adapter 클래스 활용
5.4. 키보드 단축키 및 마우스 이벤트 조합
## **6. 멀티스레딩과 Swing**
6.1. Swing에서의 스레드 문제 (EDT 개념)
6.2. `SwingWorker`를 활용한 비동기 처리
6.3. ProgressBar와 백그라운드 작업 처리
6.4. 실시간 UI 업데이트 기법
## **7. 파일 및 데이터베이스 연동**
7.1. JFileChooser를 활용한 파일 입출력
7.2. CSV, JSON 파일 읽고 쓰기
7.3. JDBC를 이용한 MySQL, PostgreSQL 연동
7.4. 테이블 데이터와 JTable 연동
## **8. UI 커스터마이징과 테마 적용**
8.1. 기본 Look and Feel 변경하기
8.2. FlatLaf, JTattoo 등을 이용한 테마 적용
8.3. 사용자 정의 컴포넌트 만들기
8.4. 애니메이션 효과 적용
## **9. 네트워크 및 외부 API 연동**
9.1. Swing에서 HTTP 요청 보내기
9.2. WebSocket을 활용한 실시간 데이터 표시
9.3. JSON 데이터 파싱 및 UI 적용
9.4. RSS, REST API 데이터를 Swing UI에서 보여주기
## **10. 배포 및 실전 프로젝트**
10.1. JAR 파일 및 실행 파일 생성
10.2. Java Web Start 및 JNLP 활용
10.3. Spring Boot와 연동하여 관리 UI 개발
10.4. 실전 프로젝트: CRUD 기능이 포함된 데스크톱 앱 제작
---
이 책은 실무에서 Swing을 활용하여 즉시 사용할 수 있는 내용을 중심으로 구성되었다. 필요한 부분이 있으면 추가해도 좋겠다.

View File

@@ -0,0 +1,192 @@
## **1. 주요 입력 컴포넌트 메서드 정리**
### **(1) `JTextField` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setText(String text)` | 텍스트 필드에 문자열을 설정 |
| `getText()` | 현재 입력된 텍스트를 반환 |
| `setEditable(boolean b)` | 편집 가능 여부 설정 (`false`이면 읽기 전용) |
| `setColumns(int columns)` | 텍스트 필드의 너비(문자 개수 단위) 설정 |
| `addActionListener(ActionListener l)` | Enter 키 입력 시 이벤트 리스너 추가 |
| `setHorizontalAlignment(int alignment)` | 텍스트 정렬 방식 설정 (`LEFT`, `CENTER`, `RIGHT`) |
---
### **(2) `JPasswordField` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setText(String text)` | 비밀번호 필드에 문자열 설정 |
| `getPassword()` | 현재 입력된 비밀번호를 `char[]` 배열로 반환 (보안상 `getText()` 대신 사용) |
| `setEchoChar(char c)` | 입력된 문자 대신 표시할 마스킹 문자 설정 (`*` 등) |
| `setEditable(boolean b)` | 편집 가능 여부 설정 |
| `addActionListener(ActionListener l)` | Enter 키 입력 시 이벤트 리스너 추가 |
---
### **(3) `JTextArea` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setText(String text)` | 텍스트 영역에 문자열 설정 |
| `getText()` | 현재 입력된 텍스트를 반환 |
| `append(String text)` | 현재 텍스트 뒤에 새로운 문자열 추가 |
| `setEditable(boolean b)` | 편집 가능 여부 설정 |
| `setRows(int rows)` | 텍스트 영역의 행 개수 설정 |
| `setColumns(int columns)` | 텍스트 영역의 열 개수 설정 |
| `setLineWrap(boolean b)` | 자동 줄바꿈 여부 설정 (`true`이면 줄이 길어지면 자동 개행) |
| `setWrapStyleWord(boolean b)` | 단어 단위로 줄바꿈할지 설정 (`true`이면 단어 기준으로 개행) |
---
## **2. 관련 이벤트 정리**
| 이벤트 리스너 | 관련 컴포넌트 | 설명 |
|--------------|-------------|----------------------------------|
| `ActionListener` | `JTextField`, `JPasswordField` | 사용자가 Enter 키를 눌렀을 때 발생 |
| `KeyListener` | `JTextField`, `JPasswordField`, `JTextArea` | 키보드 입력(키 누름, 해제, 입력) 감지 |
| `FocusListener` | `JTextField`, `JPasswordField`, `JTextArea` | 입력 필드에 포커스가 들어오거나 빠질 때 감지 |
| `DocumentListener` | `JTextField`, `JPasswordField`, `JTextArea` | 텍스트 변경 감지 (입력, 삭제, 변경) |
---
## **3. Swing 입력 컴포넌트 예제 코드와 설명**
### **(1) `JTextField` 예제 입력값을 버튼 클릭 시 표시**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextFieldExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JTextField Example");
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JLabel label = new JLabel("이름:");
JTextField textField = new JTextField(15);
JButton button = new JButton("확인");
JLabel resultLabel = new JLabel("");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = textField.getText();
resultLabel.setText("입력된 이름: " + name);
}
});
frame.add(label);
frame.add(textField);
frame.add(button);
frame.add(resultLabel);
frame.setVisible(true);
}
}
```
**설명:**
- `JTextField`에 이름을 입력하고,
- 버튼 클릭 시 `JLabel`에 입력된 값이 표시됨.
- `ActionListener`를 사용하여 버튼 클릭 이벤트를 처리.
---
### **(2) `JPasswordField` 예제 비밀번호 입력 확인**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
public class PasswordFieldExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JPasswordField Example");
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JLabel label = new JLabel("비밀번호:");
JPasswordField passwordField = new JPasswordField(15);
JButton button = new JButton("로그인");
JLabel resultLabel = new JLabel("");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
char[] password = passwordField.getPassword();
if (Arrays.equals(password, "1234".toCharArray())) {
resultLabel.setText("로그인 성공!");
} else {
resultLabel.setText("로그인 실패!");
}
Arrays.fill(password, ' '); // 보안상 배열 비우기
}
});
frame.add(label);
frame.add(passwordField);
frame.add(button);
frame.add(resultLabel);
frame.setVisible(true);
}
}
```
**설명:**
- `JPasswordField`에 비밀번호를 입력하고,
- 버튼 클릭 시 비밀번호가 `"1234"`와 일치하면 "로그인 성공!", 아니면 "로그인 실패!" 출력.
- `getPassword()`를 사용하여 보안 강화 (`getText()` 대신 사용).
---
### **(3) `JTextArea` 예제 여러 줄 입력 필드**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextAreaExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JTextArea Example");
frame.setSize(400, 250);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JTextArea textArea = new JTextArea(10, 30);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JButton button = new JButton("입력 내용 확인");
JLabel resultLabel = new JLabel("출력: ");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
resultLabel.setText("출력: " + textArea.getText());
}
});
frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.add(resultLabel, BorderLayout.NORTH);
frame.setVisible(true);
}
}
```
**설명:**
- `JTextArea`는 여러 줄 입력이 가능.
- `setLineWrap(true)``setWrapStyleWord(true)`를 설정하면 단어 단위로 자동 줄바꿈.
- `JScrollPane`을 사용하면 스크롤 기능 추가 가능.
- 버튼 클릭 시 입력된 내용을 `JLabel`에 표시.
---
### **총정리**
- **`JTextField`**: 한 줄 입력 필드, Enter 키 감지 가능.
- **`JPasswordField`**: 보안 입력 필드, `getPassword()`를 사용해야 함.
- **`JTextArea`**: 여러 줄 입력 가능, 자동 줄바꿈 기능 제공.
- **관련 이벤트**: `ActionListener` (Enter 키 감지), `KeyListener` (키 입력 감지), `FocusListener` (포커스 감지).
위 내용을 기반으로 다양한 입력 폼을 만들 수 있다!

215
docs/swing/컴포넌트.md Normal file
View File

@@ -0,0 +1,215 @@
## **1. 주요 Swing 컴포넌트 메서드 정리**
### **(1) `JLabel` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setText(String text)` | 레이블의 텍스트를 설정 |
| `getText()` | 레이블의 현재 텍스트 반환 |
| `setIcon(Icon icon)` | 아이콘을 설정 |
| `getIcon()` | 현재 설정된 아이콘 반환 |
| `setHorizontalAlignment(int alignment)` | 텍스트/아이콘의 수평 정렬 설정 (`SwingConstants.LEFT`, `CENTER`, `RIGHT`) |
| `setVerticalAlignment(int alignment)` | 텍스트/아이콘의 수직 정렬 설정 (`TOP`, `CENTER`, `BOTTOM`) |
---
### **(2) `JButton` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setText(String text)` | 버튼의 텍스트 설정 |
| `getText()` | 버튼의 현재 텍스트 반환 |
| `setEnabled(boolean b)` | 버튼 활성화/비활성화 |
| `setIcon(Icon icon)` | 버튼의 아이콘 설정 |
| `addActionListener(ActionListener l)` | 클릭 이벤트 리스너 추가 |
---
### **(3) `JToggleButton` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setSelected(boolean b)` | 토글 버튼의 선택 상태 설정 |
| `isSelected()` | 현재 선택 상태 반환 |
| `addItemListener(ItemListener l)` | 상태 변경 이벤트 리스너 추가 |
---
### **(4) `JCheckBox` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setSelected(boolean b)` | 체크박스의 선택 여부 설정 |
| `isSelected()` | 현재 선택 상태 반환 |
| `addItemListener(ItemListener l)` | 체크박스 상태 변경 이벤트 리스너 추가 |
---
### **(5) `JRadioButton` 메서드**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setSelected(boolean b)` | 라디오 버튼의 선택 상태 설정 |
| `isSelected()` | 현재 선택 상태 반환 |
| `setText(String text)` | 버튼의 텍스트 설정 |
| `addItemListener(ItemListener l)` | 상태 변경 이벤트 리스너 추가 |
---
### **(6) `JComponent` 메서드 (모든 Swing 컴포넌트의 공통 메서드)**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setBackground(Color c)` | 배경색 설정 |
| `setForeground(Color c)` | 전경색(글자색) 설정 |
| `setFont(Font f)` | 폰트 설정 |
| `setBounds(int x, int y, int width, int height)` | 컴포넌트의 위치와 크기 설정 |
| `setToolTipText(String text)` | 툴팁(마우스 오버 시 표시되는 설명) 설정 |
---
### **(7) `AbstractButton` 메서드 (JButton, JToggleButton, JCheckBox, JRadioButton의 공통 메서드)**
| 메서드 | 설명 |
|--------|------------------------------------------|
| `setText(String text)` | 버튼의 텍스트 설정 |
| `getText()` | 버튼의 현재 텍스트 반환 |
| `setIcon(Icon icon)` | 버튼의 아이콘 설정 |
| `setSelected(boolean b)` | 선택 여부 설정 (토글 버튼 및 체크박스에서 사용) |
| `isSelected()` | 현재 선택 여부 반환 |
| `addActionListener(ActionListener l)` | 액션 이벤트 추가 |
---
## **2. 관련 이벤트 정리**
| 이벤트 리스너 | 관련 컴포넌트 | 설명 |
|--------------|-------------|----------------------------------|
| `ActionListener` | `JButton`, `JToggleButton`, `JCheckBox`, `JRadioButton` | 버튼 클릭 시 동작 |
| `ItemListener` | `JToggleButton`, `JCheckBox`, `JRadioButton` | 선택 상태가 변경될 때 동작 |
| `MouseListener` | `JLabel`, `JButton`, `JToggleButton`, `JCheckBox`, `JRadioButton` | 마우스 클릭, 이동 등 감지 |
---
## **3. Swing 컴포넌트 예제 코드와 설명**
### **(1) `JLabel`과 `JButton`을 이용한 간단한 GUI**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SwingExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Swing Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JLabel label = new JLabel("버튼을 눌러보세요!");
JButton button = new JButton("클릭");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("버튼이 클릭됨!");
}
});
frame.add(label);
frame.add(button);
frame.setVisible(true);
}
}
```
**설명:**
- `JLabel`을 사용해 텍스트를 출력하고,
- `JButton`을 클릭하면 `JLabel`의 텍스트가 변경된다.
- `ActionListener`를 사용하여 버튼 이벤트를 감지한다.
---
### **(2) `JToggleButton`과 `JCheckBox` 사용 예제**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ToggleExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Toggle Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JToggleButton toggleButton = new JToggleButton("OFF");
JCheckBox checkBox = new JCheckBox("체크박스");
toggleButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (toggleButton.isSelected()) {
toggleButton.setText("ON");
} else {
toggleButton.setText("OFF");
}
}
});
frame.add(toggleButton);
frame.add(checkBox);
frame.setVisible(true);
}
}
```
**설명:**
- `JToggleButton`은 클릭할 때마다 "ON"/"OFF"로 상태가 바뀜.
- `ItemListener`를 사용하여 상태 변경을 감지.
- `JCheckBox`는 별도의 기능 없이 화면에 추가됨.
---
### **(3) `JRadioButton`을 사용한 단일 선택 예제**
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class RadioButtonExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Radio Button Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JRadioButton option1 = new JRadioButton("옵션 1");
JRadioButton option2 = new JRadioButton("옵션 2");
ButtonGroup group = new ButtonGroup();
group.add(option1);
group.add(option2);
JButton button = new JButton("선택 확인");
JLabel label = new JLabel("선택된 옵션: 없음");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (option1.isSelected()) {
label.setText("선택된 옵션: 옵션 1");
} else if (option2.isSelected()) {
label.setText("선택된 옵션: 옵션 2");
}
}
});
frame.add(option1);
frame.add(option2);
frame.add(button);
frame.add(label);
frame.setVisible(true);
}
}
```
**설명:**
- `JRadioButton`을 사용해 하나의 옵션만 선택 가능하도록 `ButtonGroup`을 사용.
- `JButton`을 클릭하면 선택된 옵션이 `JLabel`에 표시됨.
---
이제 **Swing의 주요 컴포넌트, 이벤트, 예제 코드**까지 완벽하게 정리되었다.