티스토리 뷰
- 자바 GUI는 요즘 워낙 안 쓰기 때문에 중요도가 너무 많이 떨어진다.
- 화면에 보이는 것들은 다 객체로 이루어져있고,
필요하면 다 add를 써서 붙인다.
ex. Container, GridLayout, JButton 등.
- 콘솔 액션은 사실상 Enter 하나인데,
- GUI는 액션이 정말 많다.
ex. 마우스가 움직이거나, 클릭하거나, 입력하는 행위를 하거나....
=> 그래서 ActionListener를 만들어서
액션을 수행할 때, 액션리스너는 그 액션을 듣고 있다가 뭔가를 하겠다.
- Container는 '도화지'라고 이해하면 편하다.
* 중요한 것은 콘솔 입출력과 크게 다르지 않으나, 액션이 다양하다의 느낌만 가져가는 것.
GUI에서는 Action라는 개념을 도입해서,
그 액션을 계속 리스너가 듣고만 있다.
그 듣고만 있는 애를 어떤 버튼에다가 붙여두면
그 버튼에서 어떤 상호작용이 발생했을 때,
actionPerformed의 행동이 실행되게 하겠다.
(if문이 없어도 조건 실행이 가능하게 됨)
다시 예제에 필기한 것을 정리하면
1.
class Grid extends JFrame implements ActionListener {
JButton[] jbArray = new JButton[20];
Grid() {
// 컨테이너를 가져와서 GridLayout을 설정합니다.
Container ct = getContentPane();
GridLayout gl = new GridLayout(4,5,10,10);
ct.setLayout(gl);
// 20개의 버튼을 생성하고 ActionListener를 등록합니다
for(int i = 1;i<=20;i++) {
jbArray[i-1] = new JButton("버튼"+i);
jbArray[i-1].addActionListener(this);
ct.add(jbArray[i-1]);
}
// 프레임(창)의 제목과 크기를 설정하고 보이도록 설정합니다.
setTitle("Grid"); // 프레임이 가지고 있는 타이틀
setSize(800,800); // 창의 크기
setVisible(true); // 창을 보이게 만들겠다.
// 이 메서드는 JFrame에서 제공
}
public void actionPerformed(ActionEvent ae) {
System.out.println(ae.getActionCommand());
// 이걸 하면 무슨 버튼을 눌렀는지가 콘솔에 나옴.
}
}
public class GridLayoutTest {
public static void main(String[] args) {
new Grid();
}
}
2.
class GUIMake extends JFrame implements ActionListener { // 전체 화면이 됨.
private JTextField jtf; // 한 줄 글자 입력할 수 있는 칸
private JTextArea jta; // 여러 줄 입력할 수 있는 칸.
GUIMake() {
JButton jb = new JButton("Save"); // 버튼 만듦(화면에 생김)
jtf = new JTextField("파일 이름을 입력하시오", 20);
jta = new JTextArea("파일에 쓸 글을 적으시오", 20, 20);
Container ct = getContentPane(); //객체생성x, JFrame에서 사용할 수 있게 만드는 애.
// 컨테이너는 JFrame에서 제공. 컨테이너에 담아줌.
// 컨테이너는 도화지
// 이 도화지에 레이아웃 깔아주고
ct.setLayout(new FlowLayout()); // 내용 넘치면 자동으로 다음줄에 작성
JPanel p = new JPanel(); // 패널 만들어서
ct.add(jta); // 도화지에 텍스트에어리어 추가
p.add(jtf); // 패널에 텍스트필드 추가
p.add(jb); // 패널에 버튼 추가
ct.add(p); // 마지막에 판넬 자체를 통으로 붙여버렸음=> 패널 자체를 도화지에 넣음.(세트화되어서 딱 붙음)
// 아래로 내려간 이유는, 옆에 붙이려했는데 넘쳐서 자동으로 내려감.
jb.addActionListener(this); //Save버튼 누르면 액션리스너가 동작하게 만듦.
//=>버튼 눌렀으면 actionPerformed()메서드가 동작
// this를 붙인 이유는 내가 ActionListener를 구현했으므로 나에게 있으니까.
setTitle("Test1");
setSize(500, 500);
setVisible(true); // 보여줄거니?
}
public void actionPerformed(ActionEvent ae) { // 액션을 인자로 받아서
try {
// jtf에서 입력된 문자열을 가져와서 s 변수에 저장합니다.
String s = jtf.getText(); // 텍스트 필드에 작성했던 텍스트 가져와서
// s에 해당하는 파일을 생성하기 위해 FileOutputStream을 생성합니다.
FileOutputStream fos = new FileOutputStream(s); // 걔를 파일에 쓰겠다.
// 생성된 FileOutputStream을 사용하여 DataOutputStream을 생성합니다.
DataOutputStream dos = new DataOutputStream(fos);
// jta에서 입력된 문자열을 UTF-8 형식으로 파일에 저장합니다.
dos.writeUTF(jta.getText());
// FileOutputStream을 닫습니다.
fos.close();
// 생성된 파일 이름을 콘솔에 출력합니다.
System.out.println(s + " 파일 생성~~~~");
}
// 예외 발생 시 처리합니다.
catch (Exception e) {
// 예외 처리 내용을 작성합니다.
}
}
}
public class GUITest1 {
public static void main(String[] args) {
new GUIMake();
}
}
3.
class Hi extends JFrame implements ActionListener {
JLabel jl; // 무언가를 설명해주는 라벨
Hi(){
// 컨테이너를 가져와서 FlowLayout을 설정합니다.
Container ct = getContentPane(); // 도화지 만들어서 레이아웃을 짜주고
ct.setLayout(new FlowLayout());
// 두 개의 버튼을 생성합니다.
JButton j1 = new JButton("10");
JButton j2 = new JButton("20");
// JLabel을 생성하고 컨테이너에 추가합니다.
jl = new JLabel("하이!!!!!"); // 라벨에 하이!!라고 씀
ct.add(j1); // 도화지에 버튼 두 개 추가하고
ct.add(j2);
ct.add(jl); // 도화지에 라벨도 추가
// 버튼에 ActionListener를 등록합니다
j1.addActionListener(this); //즉, Hi라는 ActionListener를 여기서 만든 첫번째 버튼(j1)에다가 넣은 것.
// 즉, this는 ActionListener <- 왜냐면 Hi도 ActionListener라고 볼 수 있으니까.
j2.addActionListener(this);
/*
액션리스너에 다시 자기자신을 넣는 게 아니라,
j1이라는 버튼에게 ActionListener를 자기 자신으로 단 것이다.
=> 즉 들어가는 것은 모두 j1에 저장이 된다는 뜻.
=> "j1에 어떤 액션이 발생하면 내가 듣겠다."
=> 내가 듣겠다는 말은
public void actionPerformed(ActionEvent ae) {
String input = ae.getActionCommand();
String result = "힘내세요!!!!" + input;
jl.setText(result);
System.out.println(input);
} 이 일을 하겠다!!
*/
// 프레임의 제목과 크기를 설정하고 보이도록 설정합니다.
setTitle("Two");
setSize(500,500);
setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
String input = ae.getActionCommand(); // 이벤트에서 액션 명령을 가져와서 input 변수에 저장합니다.
String result = "힘내세요!!!!" + input; // result 변수에 "힘내세요!!!!"와 input 변수를 결합하여 저장합니다.
jl.setText(result); // 이 result 결과를 jl(라벨)에다가 쓰겠다.
System.out.println(input);
//=>즉, j1이든 j2든 버튼이 눌리면 하이!!!라는 라벨이 힘내세요!!!라고 바뀌겠구나. 라고 알 수 있는 거죠.
}
}
public class GUITest2 {
public static void main(String[] args) {
new Hi();
}
}
728x90
반응형
'[개발] - Java > Mega' 카테고리의 다른 글
<보충> Day32,33 통신 예제 설명추가 (3) (0) | 2023.05.10 |
---|---|
<보충> Day32,33 통신 예제 설명추가 (2) (0) | 2023.05.10 |
<보충> Day32,33 통신 예제 설명추가 (1) (0) | 2023.05.10 |
<보충>Day32,33 통신 / 알아두면 좋은 것들 (0) | 2023.05.10 |
자바 퀴즈 아이디어 정리 (3) (0) | 2023.05.07 |
Comments