< Swing >
* JFrame
- AWT ==> SWING J (경량 컴포넌트)
- Frame ==> 확장
: Frame에서 더 확장된 'JFrame' 사용
* Swing에서 윈도우 창 종료하는 방법
setDefaultCloseOperation(EXIT_ON_CLOSE);
[ 응용 ]
* 이미지 아이콘
> ImageIcon, JButon, JFrame
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package day17;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
// AWT ==> SWING J (경량 컴포넌트)
// Frame ==> 에서 확장됨
// JFrame 상속
public class SwingEx1 extends JFrame{
// J컴포넌트
JButton jbtn;
SwingEx1() {
// 이미지 아이콘
ImageIcon img1 = new ImageIcon("src/images/iu.jpg");
jbtn = new JButton(img1);
add(jbtn);
setDefaultCloseOperation(EXIT_ON_CLOSE); // SWING에서 종료하는 법
setBounds(100, 100, 800, 600);
setVisible(true);
}
public static void main(String[] args) {
SwingEx1 sw = new SwingEx1();
}
}
|
cs |
* 메모장(스크롤, 폰트 지정, 메뉴바 - 메뉴 버튼 생성)
: Font, ActionListener, JfileChooser, JFrame, JTextArea
JMenu, JMenuBar, JMenuItem, JOptionPane, JScrollPane
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
package day17;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Memojjang extends JFrame implements ActionListener{
JTextArea jta; // TextArea : 여러 줄의 텍스트 가능
JScrollPane jsp; // 스크롤 기능이 있는 패널
JMenuBar jmb;
JMenu jmFile, jmHelp;
JMenuItem jmiNew, jmiOpen, jmiSave, jmiExit, jmiHelp;
Memojjang() {
jmb = new JMenuBar();
jmFile = new JMenu("FILE");
jmHelp = new JMenu("HELP");
jmiNew = new JMenuItem("NEW");
jmiOpen = new JMenuItem("OPEN");
jmiSave = new JMenuItem("SAVE");
jmiExit = new JMenuItem("EXIT");
jmiHelp = new JMenuItem("HELP");
// 아이템들을 FILE에 추가
jmFile.add(jmiNew);
jmFile.add(jmiOpen);
jmFile.add(jmiSave);
jmFile.add(jmiExit);
// 아이템들을 HELP에 추가
jmHelp.add(jmiHelp);
// 메뉴바에 File, Help 추가
jmb.add(jmFile);
jmb.add(jmHelp);
// 이벤트 처리
jmiExit.addActionListener(this);
jmiNew.addActionListener(this);
jmiOpen.addActionListener(this);
jmiSave.addActionListener(this);
jmiHelp.addActionListener(this);
// 프레임에 메뉴바를 부착
setJMenuBar(jmb);
jta = new JTextArea();
Font f = new Font("굴림체", Font.BOLD, 30);
jta.setFont(f);
// jsp = new JScrollPane(jta, 수직바정책, 수평바정책);
jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(jsp);
sendData();
setBounds(100, 100, 800, 600);
setVisible(true);
}
private void sendData() {
setDefaultCloseOperation(EXIT_ON_CLOSE); // 창 종료
}
public static void main(String[] args) {
Memojjang mj = new Memojjang();
}
@Override
public void actionPerformed(ActionEvent e) {
// 사용자의 UI는 쓰는 사람들의 언어 -> ActionCommand 말고! object, source
Object obj = e.getSource(); // -> 참조값을 사용할 수 있음
if(obj == jmiNew) {
// 1.화면에 글이 있는지 판정
String data = jta.getText(); // getText : 글자를 가져옴
int length = data.length(); // 글자 수
// 2. 글이 있다면 창을 띄워서 저장할 것인지 질문
if(length != 0) { // 글자 수가 0이 아니면 글자가 있다는 뜻
int result =
JOptionPane.showConfirmDialog(this, "저장할래?", "메모장", JOptionPane.YES_NO_CANCEL_OPTION);
// JOptionPane : 창 띄우는 클래스
// ConfirmDialog : 물어보는 창
// 왼쪽부터 버튼 누르면 0/1/2/3 숫자를 매겨놓음
// System.out.println("result : "+result);
// 3. 저장하겠다면 저장 메뉴를 띄워줌
if(result == JOptionPane.YES_OPTION) { // '예'를 눌렀다면,
// 저장... i/o 배우고..하는 걸로
}
}
// 4. 화면의 글을 지우기
jta.setText("");
} else if(obj == jmiExit) {
// 창 종료
System.out.println("종료합니다");
System.exit(0);
} else if (obj == jmiOpen) {
// 파일 열기 (열기:0 / 취소:1)
JFileChooser jfc = new JFileChooser();
int result = jfc.showOpenDialog(this);
System.out.println("result : "+result);
// 파일 열기 버튼을 눌렀다면
// JFileChooser.APPROVE_OPTION -> 상수로 만들기
if (result == JFileChooser.APPROVE_OPTION) {
System.out.println("파일 열기 기능 완료");
// 파일을 선택.. > 나머지는 파일 i/o 배운 후에 추가할 예정..
} // 취소를 누르면 아무것도 안하기
} else if (obj == jmiSave) {
JFileChooser jfc = new JFileChooser();
int result = jfc.showSaveDialog(this);
System.out.println("result : "+result);
if (result == JFileChooser.APPROVE_OPTION) {
System.out.println("파일 저장... 향후에 계속");
}
} else if (obj == jmiHelp) {
// Help 누르면 새로운 창 뜨기
new SwingEx1(); // 참조변수 없어도 괜찮다.
setVisible(false);
}
} // actionPerformed()end
} // classs end
|
cs |
* 채팅 (인공지능 심심이)
: Font, ActionListener, KeyListener, Random
JButton, JFrame, JPanel, JScrollPane, JTextArea, JTextField
- 메서드 등록
refactor - extract method - 메서드 이름 입력
> 필요할 때 메서드 호출해서 사용 가능하며, 수정할 때 메서드만 수정하면 자동 반영됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
package day17;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
// JFrame 상속
public class Chatting extends JFrame implements ActionListener, KeyListener{
// 멤버변수
JButton jbtn;
JTextField jtf;
JTextArea jta;
JScrollPane jsp;
JPanel panel;
// 랜덤 채팅
// +) HashMap ==> 키워드 입력하면 그 키워드에 어울리는 대답을 찾아서 출력하는 것도 가능..
String[] msg = {
"밥 먹었니?", "뭐해?",
"오늘은 금요일이야", "달료보자~~~~", " ㅇㅇ ", "오늘은 무리무리", "딱 한잔만 하자", "OKOK"
};
Random rnd = new Random();
Chatting() {
Font f = new Font("굴림체", Font.PLAIN, 30);
panel = new JPanel(); // < 컴포넌트 부착을 위한 빈 판넬
jbtn = new JButton("Send");
jtf = new JTextField(30); // 30자 정도가 들어갈 크기
jtf.setFont(f);
panel.add(jtf);
panel.add(jbtn); // 패널의 기본 배치관리자는 FlowLayout -> 먼저 붙인 순으로 자연스럽게 출력
jta = new JTextArea();
jta.setFont(f);
jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// 배치관리자 활용
add(jsp, "Center");
add(panel, "South");
// 이벤트 처리
jbtn.addActionListener(this);
// 키보드 리스너
jtf.addKeyListener(this); // 키보드 감지 > 채팅칠 때 엔터 쳐도 입력되도록
setDefaultCloseOperation(EXIT_ON_CLOSE); // 창 종료
setTitle("채팅");
setBounds(100, 100, 600, 800);
setVisible(true);
// 시작하면 심심이가 먼저 메시지 보냄
jta.append("심심이 : 안녕 반가워 ~~~~ \n");
}
public static void main(String[] args) {
Chatting ch = new Chatting();
}
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("버튼 눌림");
// String data = jtf.getText(); // jtf로부터 글자 가져와서
// jta.append(data + "\n"); // TextArea(채팅창)에 글자 보내줌
// jtf.setText("");
sendData(); // 리팩토링한 메서드
}
private void sendData() {
String data = jtf.getText(); // jtf로부터 글자 가져와서
jta.append("me : "+data + "\n"); // TextArea(채팅창)에 글자 보내줌
jtf.setText("");
// > sendData(); 리팩토링
// 일일이 수정할 필요 없이 이것만 수정하면 반영됨!
// 상대방 심심이의 대화 출력
// > 내가 메시지를 보내면 심심이가 랜덤하게 대답
int size = msg.length; // 8
int idx = rnd.nextInt(size); // 0~7 까지의 정수
String m = msg[idx];
jta.append("심심이 : "+m+"\n"); // 랜덤대화...
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// 엔터키 누르면 채팅 입력
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) { // 엔터키가 눌리면
// String data = jtf.getText(); // jtf로부터 글자 가져와서
// jta.append(data + "\n"); // TextArea(채팅창)에 글자 보내줌
// jtf.setText(""); // 입력창에 글자 지우기
sendData(); // >> 메서드로 만듦 : 리팩토링
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
|
cs |
'Java' 카테고리의 다른 글
[Java] Thread 스레드 / Multi Thread (0) | 2023.03.27 |
---|---|
[Java] Exception ( Error, Exception, 예외 처리, 예외 전가) (0) | 2023.03.27 |
[Java] Generic (미지수 T) + settergetter 설정, 향상된 for문 (0) | 2023.03.24 |
[Java] 로또 번호 생성기 (Lotto) (0) | 2023.03.24 |
[Java] Wrapper Class / String 클래스 전용 <String> (0) | 2023.03.23 |