이벤트 핸들링과 처리 (1)
- 이벤트 핸들링과 처리
java.awt.event/ javax.swing.event 패키지에 포함.
각 이벤트 타입은 이벤트를 발생시킨 소스 객체와 이벤트가 발생하기 전과 후의 소스 객체 상태에 대한 정보로 표현된다.
객체들에 리스너를 등록시켜 이벤트 발생 여부를 통보받게 된다.
리스너는 java.awt.event/ java.beans/ javax.swing.event 패키지 안에 정의된 XXXListener 인터페이스를 구현한 클래스.
EventListenerList - class javax.swing.event.EventListenerList
EventListenerList 는 XXEvent/XXListener 쌍을 지닌 배열이다.
이벤트가 발생하였을 때 리스트를 검색하여 이와 일치하는 타입을 지닌 리스터에게 전달된다.
JCompnent는 EventListenerList를 listenerList라 칭하고 protected 필드로 선언.
모든 서브 클래스들은 이를 상속.
스윙 컴포넌트들은 listenerList를 통해 직접적으로 리스너를 다룬다.
- 이벤트 처리 쓰레드
모든 이벤트들은 이벤트 처리 쓰레드 (java.awt.EventDispatchThread의 인스턴스)가 이들을 리스너에게 전달함으로써 수행.
이벤트 처리 쓰레드는 가장 중요한 쓰레드로 컴포넌트의 수정된 상태 정보를 유지하고 이를 애플리케이션에 디스플레이하는
중요한 역할을 담당.
이 쓰레드는 시스템 이벤트 큐인 FIFO 이벤트들의 큐를 지닌다. (java.awt.EventQueue의 인스턴스)
모든 이벤트들은 연속적으로 수행되어 재페인트되는 도중에 컴포넌트의 상태가 수정되지 않도록 한다.
따라서 이벤트 처리 쓰레드 외부에서 이벤트가 처리되지 않도록 해야한다.
- 멀티 쓰레드 처리
모든 이벤트 핸들링 코드는 이벤트 처리 쓰레드에서만 실행되어야 한다.
스윙은 SwingUtilities 클래스를 제공하여 Runnable 객체들을 시스템 이벤트 큐에 추가한다.
invokeLater() : Runnable 객체를 시스템 이벤트 큐에 추가한 후 즉시 복귀.
invokeAndWait() : Runnable 객체를 시스템 이벤트 큐에 추가하고 이것이 처리될 때까지 기다린 후 그 이후에 복귀.
Runnable trivialRunnable = new Runnable(){
public void run(){
doWork();
}
};
SwingUtilities.invokeLater(trivialRunnable);
try{
Runnable trivialRunnable2 = new Runnable(){
public void run(){
doWork();
}
};
SwingUtilities.invokeAndWait(trivialRunnable2);
}
catch(Exception e){
}
Thread workHard = new Thread(){
public void run(){
doToughWork(); //시간이 많이 소비하는 작업 수행
SwingUtilities.invokeLater(new Runnable(){
public void run(){
updateComponents(); //컴포넌트의 상태 수정
}
});
}
}
workHard.start();