import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
/**
* GUI프로그램 순서
* 1. 이벤트소스(bt)와 이벤트종류(ActionEvent)를 결정한다
* 2. 이벤트처리용 클래스(이벤트핸들러)를 작성한다
* class MyHandler implements ActionListener{
* }
* 3. 이벤트소스와 이벤트핸들러를 연결한다
* bt.addActionListener(new MyHandler()); // 버튼에서 이벤트가 발생하면 클릭되었습니다 메시지 발생
* */
class MyHandler implements ActionListener { // java는 click 이벤트는 없고 Action 이벤트가 있다.
// 이벤트가 발생했을 때 적는거 = 핸들러
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("클릭되었습니다");
}
}
public class GUITest {
private JFrame f;
private JButton bt;
private JTextField t;
public GUITest() {
f = new JFrame("프레임"); //창
bt = new JButton("클릭"); //버튼
t = new JTextField("입력하세요"); //한줄입력란
Container c = f.getContentPane(); //프레임뒷판
c.setLayout(new FlowLayout()); //순서대로 배치하겠다
c.add(bt); //버튼추가
c.add(t); //텍스트프레임추가
bt.addActionListener(new MyHandler()); //이벤트소스와 이벤트핸들러 연결.
f.setSize(300, 200);
f.setVisible(true);
}
public static void main(String[] args) {
new GUITest();
}
}
// 한줄 입력란에 클릭되었습니다.
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
class MyHandler implements ActionListener {
private JTextField t;
MyHandler(JTextField t) {
this.t = t;
}
@Override
public void actionPerformed(ActionEvent e) {
t.setText("클릭되었습니다");
}
}
public class GUITest {
private JFrame f;
private JButton bt;
private JTextField t; // 위의 (JTextField t) this.t=t 와 같은 t 공유
public GUITest() {
f = new JFrame("프레임"); //창
bt = new JButton("클릭"); //버튼
t = new JTextField("입력하세요"); //한줄입력란
Container c = f.getContentPane(); //프레임뒷판
c.setLayout(new FlowLayout()); //순서대로 배치하겠다
c.add(bt); //버튼추가
c.add(t); //텍스트프레임추가
bt.addActionListener(new MyHandler(t)); //이벤트소스와 이벤트핸들러 연결
f.setSize(300, 200);
f.setVisible(true);
}
public static void main(String[] args) {
new GUITest();
}
}
//Inner class
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class GUITest {
private JFrame f;
private JButton bt;
private JTextField t;
class MyHandler implements ActionListener { // 위치는 GUITest 안이면 상관 없음
@Override
public void actionPerformed(ActionEvent e) {
t.setText("클릭되었습니다");
}
}
public GUITest() {
f = new JFrame("프레임"); //창
bt = new JButton("클릭"); //버튼
t = new JTextField("입력하세요"); //한줄입력란
Container c = f.getContentPane(); //프레임뒷판
c.setLayout(new FlowLayout()); //순서대로 배치하겠다
c.add(bt); //버튼추가
c.add(t); //텍스트프레임추가
// bt 3가지 방법으로 작성 가능 결과는 위와 같다
// ver1
// bt.addActionListener(new MyHandler());
// ver2
// ActionListner 인터페이스를 구현한 이름없는 클래스 타입 객체(익명클래스)
/* bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
t.setText("클릭되었습니다");
}
});*/
// ver5
bt.addActionListener((e) -> {t.setText("클릭되었습니다");});
f.setSize(300, 200);
f.setVisible(true);
}
public static void main(String[] args) {
new GUITest();
}
}
※ Inner class
class 안에 class 넣기
재사용성은 떨어지나 Outer class의 멤버변수, 메서드를 자기 것처럼 사용가능하다
Outer class를 사용하나 Inner class 로 사용하나 결과는 동일
※ 람다식
안드로이드 앱에선 기본
자바스크립트의 화살표 함수"()=>{}"가 유사함
bt.addActionListener(); //() 안에 addActionListener 객체가 와야함
bt.addActionListener((e) -> {t.setText("클릭되었습니다");});
'언어 > Java' 카테고리의 다른 글
복제(shallow copy, deep copy) (0) | 2023.08.02 |
---|---|
리플렉션(Reflection) (0) | 2023.08.02 |
인터페이스 예시 (0) | 2023.08.02 |
인터페이스(Interface) (0) | 2023.08.01 |
클래스의 용도 (0) | 2023.08.01 |