국비지원학원/Java

38일차

초코맛 2018. 12. 18. 02:29
반응형
*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
반응형

'국비지원학원 > Java' 카테고리의 다른 글

40일차  (0) 2018.12.19
39일차  (0) 2018.12.19
37일차  (0) 2018.12.18
36일차  (0) 2018.12.10
35일차  (0) 2018.12.08