이벤트 처리
이벤트 정의
- 이벤트는 window programing에서 어떤 특정한 행동이 발생한 그 자체를 의미한다.
- 예를 들어 메뉴를 선택 했다든가, 마우스를 클릭하거나, 윈도우의 크기를 조절하는 행위
- 이런 방식의 프로그래밍을 이벤트 중심의 프로그래밍이라고 하는데 윈도우 프로그래밍에서 중요한 개념중 하나
- 이벤트 소스는 이벤트가 발생할 수 있는 대상을 의미하고
- 그 대상으로 부터 이벤트가 발생하면 발생된 이벤트를 처리해서 결과를 낼 수 있도록 해주는 것을 이벤트핸들러라고 한다.
자바에서 이벤트 처리
- 프로그램이 실행중에 OS가 해당 프로그램에서 이벤트가 발생이 되는지를 검사
- 이벤트가 발생되면 OS가 JVM에게 이벤트를 전달하고 JVM은 발생된 이벤트를 처리하기 위하여 이벤트 오브젝트를 생성
- 이벤트를 처리하기 위하여 이벤트 오브젝트를 가지고 핸들러를 호출
이벤트 소스
- 이벤트 소스는 이벤트가 발생되는 컴포넌트를 말한다.
- 즉, 버튼, 채크박스, 리스트, 프레임, 마우스 등과 같은 컴포넌트틀이 이벤트 소스이다.
이벤트 리스너
- 이벤트 소스에서 이벤트가 발생하는지를 검사하고 있다가 이벤트가 발생이 되면 실제적으로 이벤트를 처리할 수 있도록 만든 인터페이스이다.
이벤트 핸들러
- 이벤트 리스너에 전달된 이벤트를 실제로 처리할 수 있도록 이벤트 리스너에 포함되어 있는 메소드로 발생된 이벤트 오브젝트를 받아와서 실제적으로 처리해주는 기능을 가지고 있다.
자바에서 이벤트를 판정하고 처리한다.
리스너 : 제이브이엠이 가지고 있는 이벤트 감시자!!
이벤트를 감지하기 위해선 리스너(감시자)를 등록시켜야함
감지 후 리스너는 이벤트에 따르는 핸들러를 호출한다.
즉, 이벤트 종류에 따르는 리스너가 종류별로 다있음!
가장 대표적인것이 액션 이벤트 >> 예제 참조
import java.awt.*;
import java.awt.event.*;
class EventEx extends Frame implements ActionListener{
public void actionPerformed(ActionEvent e){ // 이벤트 처리
System.out.println("==발생된 이벤트 정보==");
System.out.println("getSource() ="+e.getSource());
System.out.println("toString() ="+e.toString());
System.out.println("getID() ="+e.getID());
System.out.println("paramString() ="+e.paramString());
}
public EventEx(String title){
super(title);
Button b1 = new Button("버튼"); // 이벤트 소스
b1.addActionListener(new TestEvent()); // 이벤트 리스너 등록, 엑션리스너에 등록!!
//b1.addActionListener(this); this는 핸들러
add(b1);
setSize(300,200);
show();
}
public static void main(String[] args) {
new EventEx("이벤트");
}
}
class TestEvent implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.out.println("Test Event 핸들러");
}
}
핸들러를 구성하기 위해서는
이벤트에 따르는 엑션 인터페이스를 일일히 오버라이딩 해야함?
이벤트의 종류들...
import java.awt.event.*;
class AllEventHandler
implements ActionListener, ComponentListener, MouseMotionListener,
MouseListener, MouseWheelListener, KeyListener, TextListener,
FocusListener, ItemListener, AdjustmentListener, WindowListener,
WindowFocusListener, WindowStateListener, ContainerListener {
// ActionListener의 메서드
public void actionPerformed(ActionEvent ae) {}
//버튼을 누르거나 등등
// ComponentListener의 메서드
public void componentMoved(ComponentEvent ae) {}//움직일떄
public void componentHidden(ComponentEvent ae) {}//숨겨졌을때
public void componentResized(ComponentEvent ae) {}//사이즈 조절할때
public void componentShown(ComponentEvent ae) {}//보여질때
//동작에 따라 JVM이 해당 이벤트를 알아서 호출
// MouseMotionListener의 메서드
public void mouseDragged(MouseEvent me) {}//드레그할때
public void mouseMoved(MouseEvent me) {}//움직일때
// MouseListener의 메서드
public void mousePressed(MouseEvent me) {}//누를떄
public void mouseReleased(MouseEvent me) {}//누르고 유지
public void mouseEntered(MouseEvent me) {}//마우스가 해당 영역에 들어갔을때
public void mouseExited(MouseEvent me) {}//마우스가 빠져나갔을때
public void mouseClicked(MouseEvent me) {}//클릭
// MouseWheelListener의 메서드
public void mouseWheelMoved(MouseWheelEvent e) {}
// KeyListener의 메서드
public void keyPressed(KeyEvent ke) {}
public void keyReleased(KeyEvent ke) {}
public void keyTyped(KeyEvent ke) {}
// TextListener의 메서드
public void textValueChanged(TextEvent te) {}//글자가 바뀠을때
// FocusListener의 메서드
public void focusGained(FocusEvent fe) {}
public void focusLost(FocusEvent fe) {}
// ItemListener의 메서드
public void itemStateChanged(ItemEvent ie) {}//체키박스나 라디오버튼
// AdjustmentListener의 메서드
public void adjustmentValueChanged(AdjustmentEvent ae) {}//스크롤바가 움직일때
// WindowListener의 메서드
public void windowClosing(WindowEvent we) {}//x버튼 활성화시킬 때
public void windowOpened(WindowEvent we) {}//창이 열렸을 때
public void windowIconified(WindowEvent we) {}//창이 최소화 되었을 때
public void windowDeiconified(WindowEvent we) {}//최소화 되었다 다시 올라올 때
public void windowClosed(WindowEvent we) {}//닫힐 때
public void windowActivated(WindowEvent we) {}//활성화 상태일 때
public void windowDeactivated(WindowEvent we) {}//비활성화 상태일 때
// WindowFocusListener의 메서드
public void windowGainedFocus(WindowEvent e) {}
public void windowLostFocus(WindowEvent e) {}
// WindowStateListener의 메서드
public void windowStateChanged(WindowEvent e) {}
// ContainerListener의 메서드
public void componentAdded(ContainerEvent ce) {}
public void componentRemoved(ContainerEvent ce) {}
} // End of EventHandler class
이 중에 하나만 쓰려고해도 인터페이스 이기떄문에 모든 메서드를 오버라이딩 해야하는 불편함이 있다.
따라서 ~adapter 등등은 이런 불편함을 해소하기위해 인터페이스를 구현해 놓았다.
예를 들어 WindowAdapter
//WindowEx1.java 참조 <<일일히 구현해 놓았음
/*
import java.awt.*;
import java.awt.event.*;
class WindowEx1 extends Frame implements WindowListener{
public WindowEx1(String str){
super(str);
addWindowListener(this);
setSize(200,100);
setVisible(true);
}
public void windowActivated (WindowEvent e) {
System.out.println("windowActivated");
}
public void windowClosed (WindowEvent e) {
System.out.println("windowClosed");
}
public void windowClosing (WindowEvent e) {
System.out.println("windowClosing");
System.exit(0);
}
public void windowDeactivated (WindowEvent e) {
System.out.println("windowDeactivated");
}
public void windowDeiconified (WindowEvent e) {
System.out.println("windowDeiconified");
}
public void windowIconified (WindowEvent e){
System.out.println("windowIconified");
}
public void windowOpened (WindowEvent e) {
System.out.println("windowOpened");
}
public static void main(String [] args){
new WindowEx1("test");
}
}
*/
이것을 이렇게 Adapter를 이용하여 필요한 것만 오버라이딩 하여 사용할 수 있다.!!
import java.awt.*;
import java.awt.event.*;
class WindowEx1 extends Frame{
public WindowEx1(String str){
super(str);
addWindowListener(new WindowEx());
setSize(200,100);
setVisible(true);
}
public static void main(String [] args){
new WindowEx1("이벤트");
}
}
class WindowEx extends WindowAdapter
{
public void windowClosing (WindowEvent e) { //필요한 것만 오버라이딩
System.out.println("windowClosing");
System.exit(0);
}
}