반응형
*Event Handling
-
사용자의 동작에 따른 이벤트를 처리할 처리코드를 만들어두고 그 코드를 감지하고 실행하는 것(감지와 처리는 Listener)
-
//Listener는 Event의 interface로 상수와 추상메소드를 갖는데, 추상메소드는 body가 없어 상속받아 사용해야한다.
-
//Listener를 부모로 사용함으로서 상속받아 재사용으로 method와 할당된 method사용 가능??????
-
//implement는 구현 인데...interface를 구현한 자식클래스 만들때 implement
-
AWT와 Swing에서 함께 사용할 수 있다.
-
Java.awt.event package에서 관련 class와 interface를 제공.
-
interface가 하나이상의 추상 method를 가진다면 사용의 편의성을 위해 XxxAdapter class를 제공한다.
사용자 동작 |
이벤트감지처리
Listener(interface) |
사용 예 (이벤트 등록) |
클릭,
엔터키 |
ActionListener |
버튼명.addActionListener(리스너를 구현한 클래스의 객체);
TextArea명.
//EventHandler클래스를 프레임의 이벤트로 등록
//addActionListener는 Button의 method |
윈도우 |
WindowListener |
|
아이템 작업
(List, choice의 item하나하나) |
ItemListener |
|
키보드를 눌렀을때 |
KeyListener |
|
마우스에 관한 |
MouseListener |
|
*is a 작성법)
=> MyClass는 Frame이다.
=> MyClass는 XxxListener이다. 가 성립.(is a 관계인것)
-
XxxListener를 구현 할 때,(is a 관계인것)=>가장쓰기 편한 상태.
-
1.상속으로 Frame을 받고, XxxListener를 구현한다.
-
public class Test extends Frame implements ActionListener{
-
2.이벤트처리과 관련있는 Component를 선언
-
=>Override한 method안에서 해당 Component를 사용할 때.
-
Butten btn;
-
<<<<필드에 올려놓고
-
3.Component를 생성
-
public Test(){
-
//생성자-객체 초기화 값, 객체가 생성될때 실행 될 코드.
-
btn = new Button("OO");
-
//생성자에 들어가도 괜찮고 init으로 메소드?해도..
-
4.Component가 Event를 발생 시킬 수 있도록 등록.
-
(xx.addXxxListener(이벤트가 발생되었을때 처리될 객체);)
-
btn.addActionListener(this(내가만든클래스는 액션리스너이기 때문에));
-
//이벤트가 등록되고 이벤트가 발생하면 입력된 객체의 Override된 추상 method가 호출.
-
5.abstract method Override
-
}//생성자
-
//<<<<<<This때문에 추상메소드가 호출되어 실행된다.
-
//abstract method Override
-
public viod actionPerforred(ActionEvent){
-
//이벤트가 발생했을때 처리할 코드
-
//여기에서 btn을 사용(값사용,비교)할 필요가 없다면 btn을 필드에 올릴필요가 없다.
*Has a 작성법)
=>Design은 Frame이다.
=>Event는 XxxListener 이다.
=>Event는 Design을 가지고 있다.
-
<디자인과 이벤트를 분리해 깔끔해지지만 값넘기기가 어렵다.
-
장점) 디자인과 이벤트처리 코드를 분리할 수 있다.(복잡도 낮춤)
-
단점) 클래스가 늘어난다. (파일관리가 어려워짐(불편함)),
-
값넘기기 어렵다.
-
에러처리가 복잡해진다.
-
-
1.Frame을 상속받는 클래스 생성
-
public class Test extends Frame{
-
2.이벤트 관련 Component 선언
-
Button btn();
-
3.생성
-
public Test(){
-
btn=new Button();
-
}//생성자
-
다른클래스)
-
1.XxxListener를 구현하는 클래스 생성
-
public class TestImpl implements ActionListener{
-
2.디자인 클래스를 has a관계로 가지고 사용할 수 있도록 선언
-
private Test t;
-
3.생성자에서 디자인 클래스르 받는다.
-
public Test impl(Test t){
-
this.t= t;
-
}
-
4.추상메소드 Override
-
public void actionPerformed(ActionEvent ae){
-
//이벤트가 발생했을때 처리
-
}
-
}
-
다시돌아가서)
-
4.Event처리 객체 생성
-
TestImpl ti = new TestImpl(this);
-
//has a 관계가 설정이 된것
-
5.이벤트 등록
-
btn.addActionLinstener(ti);
-
//얘때문에 추상메소드 Override된 것 호출.
-
주소를 넘기는거 call by reference.............
*Inner class 작성법)
-
이벤트 처리를 특정 디자인에만 사용할 때.
-
=>디자인 클래스안에서 클래스로 이벤트를 구분하여 처리할 때.
-
-
작성법)
-
1.window Component를 상속
-
public class Test extends Frame{ //<이 클래스는 디자인만 가짐
-
2.이벤트 처리와 관계된 Component 선언
-
Button btn;
-
3.생성
-
public Test(){
-
btn=new Button("버튼");
-
}
-
4.이벤트를 처리하기위한 inner class 작성. <<접근지정자는 public!!!
-
public class Inner implements ActionListener{
-
-
5.추상 method Override
-
public void actionPerforred(ActionEvent ae){
-
//이벤트가 발생했을 때 처리 할 코드
-
}
-
}//end inner class
-
6.이벤트 등록
-
//<3번 아래로가
-
//inner class를 객체화
-
Test.Inner in = this.new Inner();
-
//Component가 이벤트를 발생할 수 있도록 등록.
-
btn.addActionListener(in);////override된 method로 호출.
-
//안드로이드에서 많이 사용한다. 자바에선 별루.
*Anonmous Inner class 작성법)
-
<클래스를 값으로 사용할때 ..? 재사용성이 많이 떨어지는 작성법
-
이벤트 처리 코드의 재 사용성이 가장 낮은 방법.(딱 한번만 발생하는경우 사용)
-
-
작성법)
-
1.Window Component를 상속
-
public class Test extends Frame{
-
2.Component를 선언
-
Button btn;
-
3.생성
-
public Test(){
-
btn = new Button("버튼");
-
4.이벤트 등록//anonymous inner class로 .
-
btn.addActionListener( new 클래스|인터페이스(ActionListener(){
-
//추상 method override
-
public void actionPerformed(ActionEvnet ae){
-
//이벤트가 발생했을때 동작할 코드
-
}
-
} ); //파일관리가 편하다는 장점.
가장권장하고 도움이 되는 방법은 has a
<가져다 쓰는것이 크게 도움이 될것...
*Adapter Class
-
이벤트를 처리하는 interface가 추상method를 하나이상 가지고 있을때, interface를 미리 구현한 class들
-
<인터페이스가 추상메소드를 하나 가지고 있을땐 없다.
-
사용상의 편의성 증대.
-
WindowListener 가 추상method를 7개 ===>>> WindowAdapter는0개
<<<숙제>>>>
package day1211;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
@SuppressWarnings("serial")
public class Work26 extends Frame implements ItemListener{
Choice choColor;
Label lblColor;
public Work26() {
lblColor = new Label("오늘은 화요일");
lblColor.setFont(new Font("Dialog",Font.BOLD,15));
choColor = new Choice();
choColor.add("색선택");
choColor.add("검은색");
choColor.add("파란색");
choColor.add("빨간색");
choColor.add("녹색");
choColor.add("심홍색");
setLayout(null);
lblColor.setBounds(40,50,100,25);
choColor.setBounds(160,50,100,25);
add(lblColor);
add(choColor);
//이벤트 등록
choColor.addItemListener(this);
setBounds(200, 200, 400, 300);
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
dispose();
}//windowClosing
});//addWindowListener
}//Work26
public static void main(String[] args) {
new Work26();
}//main
@Override
public void itemStateChanged(ItemEvent e) {
switch (choColor.getSelectedIndex()) {
case 1 : lblColor.setForeground(Color.BLACK); break;
case 2 : lblColor.setForeground(Color.BLUE); break;
case 3 : lblColor.setForeground(Color.RED); break;
case 4 : lblColor.setForeground(Color.GREEN); break;
case 5 : lblColor.setForeground(Color.MAGENTA); break;
}
}
}//class
반응형