2013년 10월 30일 수요일

2013. 10. 30 Java Event Listener는 어떻게 Event를 받아들이나.

1. Q : 아래 코드에서 main method에 actionPerformed 메소드를 실행하는 코드가 안쓰여있는데 버튼 클릭을 하면 어떻게 버튼 클릭 Event를 인식해서 Listener안의 actionPerformed를 실행하나?  
import java.awt.*;
public class TestButton {
  public static void main(String args[]) {
    Frame f = new Frame("Test");
    Button b = new Button("Press Me");
    b.addActionListener(new ButtonHandler());
    f.add(b,BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
  }

}

class ButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e)
{
    System.out.println("Action occurred");
    System.out.println("Button's label is :”
   + e.getActionCommand());
  }
}


A : 아래 코드를 보자.
public class Button {
  private final List<ActionListener> listeners = new ArrayList<ActionListener>();

  public void addActionListener(ActionListener l) {
    listeners.add(l);
  }

  public void click() {
    ActionEvent event = new ActionEvent(this, 0, "click");
    for (ActionListener l : listeners) {
      l.actionPerformed(event);
    }
  }
}

main 함수 안에 없는 actionPerformed가 click() 메소드 안에있다. click은 Button class안에 있고  Button class는 import된 java.awt에 포함되어 있다. ButtonHandler라는 listner만 addActionListener를 통해 더해주면 실행은 awt가 알아서 하는 식. 
'아래코드'에서 마우스 클릭후 생성되는 이벤트는 모든 Listener의 actionPerformed의 파라미터에 들어가서 실행한다. 그 과정에서 새로 등록된 Listener의 actionPerformed도 실행됨.

오늘의 결론 : Listener 만들어 놓기만 하면 Java.awt가 actionPerformed는 알아서 실행시켜줌.

댓글 없음:

댓글 쓰기