[Java] Window Programing - <Event>
- BACKEND/Java
- 2017. 11. 6. 10:41
● Event
1) 이벤트 소스(컴퍼넌트) : 이벤트가 발생한 위치
2) 이벤트 클래스(종류) : 이벤트 종류
java.util.EventObject -> 자바 도큐먼스에서 확인
java.awt.AWTEvent
ActionEvent
- 컴퍼넌트가 활성화 될 때 발생하는 이벤트
AdjustmentEvent
- 스크롤바와 같이 조정 가능한 컴퍼넌트에서 조정이 일어날때 발생하는 이벤트
ComponentEvent
ContainerEvent
- 컨테이너에 컴퍼넌트가 추가/삭제되는 경우 발생하는 이벤트
FocusEvent
-컴퍼넌트에 포커스가 들어왔을 때 발생하는 이벤트
InputEvent
- KeyEvent
- MouseEvent
PaintEvent
- 컴퍼넌트가 다시 그려질 때 발생하는 이벤트
WindowEvent
- 윈도우가 활성화 또는 닫힐 때 발생하는 이벤트
ItemEvent
- 리스트, 초이스와 같이 선택항목이 존재하는 컴퍼넌트에서 선택항목이 선택될 때 발생하는 이벤트
TextEvent
- 텍스트 컴퍼넌트와 내용이 변화될 때 발생하는 이벤트
3) 이벤트 핸들러(처리, 리스너(listener) 인터페이스) : 이벤트 처리
java.awt.event -> 자바 도큐먼트에서 확인
4) 이벤트 소스와 핸들러의 연결
- 이벤트 소스.add이벤트클래스Listener(핸들러의 주소);
5) 이벤트 코드 처리 방식
- 이벤트 소스와 이벤트 핸들러가 같은 클래스인 경우
- 이벤트 소스와 이벤트 핸들러가 다른 클래스인 경우
- 이벤트 핸들러가 내부 클래스인 경우
- 이벤트 핸들러가 무명 클래스인 경우
무명클래스 : 인터페이스를 상속받는 별도의 구현체인(클래스= EventHandler)를
만들지 않고 축약해서 만드는 방식
6) Adapter Class
- 인터페이스를 직접 상속받지 않고 중간에 미리 상속을 받아 오버라이딩된 클래스
자바 도큐먼트 ↓
https://docs.oracle.com/javase/9/docs/api/index.html?overview-summary.html
이벤트 소스와 이벤트 핸들러가 같은 클래스인 경우 예제
package event; import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class EventTest1 extends Frame implements ActionListener{ private Button btn1, btn2; private TextArea ta; EventTest1(){ btn1 = new Button("눌러주세요"); btn2 = new Button("종료"); ta = new TextArea();
add("North", btn1); add("Center", ta); add("South", btn2);
btn1.addActionListener(this); btn2.addActionListener(this); }
@Override public void actionPerformed(ActionEvent arg0) { //String cmd = arg0.getActionCommand(); //현재 이벤트 소스의 라벨값만 가져온다. 한정적 기능
Button btn = (Button)arg0.getSource(); // 버튼 객체의 모든 정보를 받아와서 버튼이 가지고있는 기능을 모두 사용가능 String cmd = btn.getLabel();
if(cmd.equals("눌러주세요")) { btn.setBackground(Color.BLUE); ta.setText(ta.getText()+"버튼이 눌렸어요\n"); }else { dispose(); } } public static void main(String[] args) { //이벤트 소스와 핸들러가 같은 클래스인 경우 EventTest1 test = new EventTest1(); test.setSize(300,400); test.setVisible(true); } } |
실행결과 ↓
이벤트 소스와 이벤트 핸들러가 다른 클래스인 경우 예제
package event; import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; class EventHandler implements ActionListener{ private TextArea ta; private Frame f; //EventTest2에 있는 TextArea, Frame 값을 받기위해 변수생성과 생성자 생성으로 값을 받아온다.
EventHandler(TextArea ta, Frame f){ this.ta = ta; this.f = f; } @Override public void actionPerformed(ActionEvent arg0) { String cmd = arg0.getActionCommand(); //현재 이벤트 소스의 라벨값만 가져온다. 한정적 기능
if(cmd.equals("눌러주세요")) { ta.setText(ta.getText()+"버튼이 눌렸어요\n"); }else { f.dispose(); } }
} public class EventTest2 extends Frame { private Button btn1, btn2; private TextArea ta; EventTest2(){ btn1 = new Button("눌러주세요"); btn2 = new Button("종료"); ta = new TextArea();
add("North", btn1); add("Center", ta); add("South", btn2);
EventHandler handler = new EventHandler(ta, this); /* 다른 클래스에 있는 actionPerformed 메소드를 실행시키기위해 인스턴스 생성해서 주소값을 넣어줘야 한다. */ btn1.addActionListener(handler); btn2.addActionListener(handler); }
public static void main(String[] args) { //이벤트 소스와 핸들러가 다른 클래스인 경우 EventTest2 test = new EventTest2(); test.setSize(300,400); test.setVisible(true); } } |
실행결과 ↓
이벤트 핸들러가 내부 클래스인 경우 예제
package event; import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class EventTest3 extends Frame { private Button btn1, btn2; private TextArea ta; EventTest3(){ btn1 = new Button("눌러주세요"); btn2 = new Button("종료"); ta = new TextArea();
add("North", btn1); add("Center", ta); add("South", btn2);
EventHandler handler = new EventHandler();
btn1.addActionListener(handler); btn2.addActionListener(handler); }
class EventHandler implements ActionListener{
@Override public void actionPerformed(ActionEvent arg0) { String cmd = arg0.getActionCommand();
if(cmd.equals("눌러주세요")) { ta.setText(ta.getText()+"버튼이 눌렸어요\n"); }else { dispose(); } }
} public static void main(String[] args) { /* * 이벤트 소스와 핸들러가 내부 클래스인 경우 * 내부 클래스는 외부클래스에 있는 자원을 사용할 수 있다 * 외부클래스 자원사용가능으로 인해 생성자, 변수 등을 따로 만들지 않아서 코드가 간단해진다. */ EventTest3 test = new EventTest3(); test.setSize(300,400); test.setVisible(true); } } |
실행결과 ↓
이벤트 핸들러가 무명 클래스인 경우 예제
package event; import java.awt.Button; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class EventTest4 extends Frame { private Button btn1, btn2; private TextArea ta; EventTest4(){ btn1 = new Button("눌러주세요"); btn2 = new Button("종료"); ta = new TextArea();
add("North", btn1); add("Center", ta); add("South", btn2);
ActionListener listen = new ActionListener() { //class EventHandler implements ActionListener를 축약한 내용이다. @Override public void actionPerformed(ActionEvent arg0) { String cmd = arg0.getActionCommand();
if(cmd.equals("눌러주세요")) { ta.setText(ta.getText()+"버튼이 눌렸어요\n"); }else { dispose(); } }
};
btn1.addActionListener(listen); btn2.addActionListener(listen); }
public static void main(String[] args) { /* * 이벤트 소스와 핸들러가 무명 클래스인 경우 * 무명클래스 -> 클래스를 만들고 인스턴스까지 축약해서 만들어버린다. * 즉석으로 한번만 필요할 경우 사용한다. * 무명클래스 제약 : 이름이 없기에 생성자를 만들수가 없어서 인자값을 * 받아올수가 없다. */ EventTest4 test = new EventTest4(); test.setSize(300,400); test.setVisible(true); } } |
실행결과 ↓
Adapter Class 예제
package event; import java.awt.Button; import java.awt.Frame; import java.awt.TextField; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; class WindowExit extends WindowAdapter{ //Adapter 클래스는 쓸데없는 오버라이딩을 받지 않기 위해 사용
private Frame f;
WindowExit(Frame f){ this.f = f; } @Override public void windowClosing(WindowEvent arg0) { f.dispose(); //dispose는 frame에서 상속받아서 사용하기 때문에 주소값 받아와야한다. }
} public class AdapterTest2 extends Frame { private TextField tf; private Button btnExit;
public AdapterTest2() { tf = new TextField("x버튼을 누르면 종료합니다."); btnExit = new Button("종료");
add("North", tf); add("Center", btnExit);
addWindowListener(new WindowExit(this)); }
public static void main(String[] args) { AdapterTest2 test = new AdapterTest2(); test.setSize(300,400); test.setVisible(true); } } |
실행결과 ↓
오른쪽 상단의 X를 누르면 종료된다.
'BACKEND > Java' 카테고리의 다른 글
[Java] Window Programming - <Menu> (0) | 2017.11.07 |
---|---|
[Java] ItemEvent/TextEvent 예제 (0) | 2017.11.07 |
[Java] Window Programming - <Layout> (0) | 2017.11.06 |
[Java] Window Programming (0) | 2017.11.06 |
[Java] IO 예제 (0) | 2017.11.02 |