EventHandler
EventHandler (이벤트 리스너 동적 생성)
EventHandler 클래스는 메서드가 수신 이벤트 객체와 대상 객체를 포함하는 간단한 문장을 실행하는 이벤트 리스너를 동적으로 생성할 수 있게 지원해요. 애플리케이션 빌더처럼 개발자가 빈 간의 연결을 만들 수 있게 해 주는 대화형 도구에서 사용하도록 설계됐어요.
본문
보통 연결은 사용자 인터페이스 빈(이벤트 소스)에서 애플리케이션 로직 빈(대상)으로 만들어져요. 가장 효과적인 연결은 애플리케이션 로직을 사용자 인터페이스로부터 분리하는 방식이에요. 예를 들어 JCheckBox에서 boolean 값을 받는 메서드로의 연결용 EventHandler는 체크 박스의 상태를 추출해 그 메서드로 직접 전달하므로 메서드가 UI 계층과 분리돼요.
인너 클래스는 UI 이벤트를 처리하는 더 일반적인 방법이지만, EventHandler는 그 중 일부만 처리해요. 하지만 EventHandler는 인너 클래스보다 장기 영속성(long-term persistence) 방식에서 더 잘 동작해요. 또 대규모 애플리케이션에서 동일한 인터페이스를 여러 번 구현할 때 디스크와 메모리 사용량을 줄일 수 있어요. EventHandler가 만든 리스너는 동일한 인터페이스의 구현을 공유하는 Proxy 클래스에 의존하기 때문에 작은 크기를 가져요.
리스너를 직접 다루지는 않고, 주로 create() 메서드로 특정 리스너 인터페이스를 구현하는 객체를 만들어요. 이 리스너 객체는 내부적으로 EventHandler 객체를 사용해 이벤트, 이벤트 발생 시 메시지를 보낼 객체, 보낼 메시지(메서드), 그리고 메서드의 인자에 관한 정보를 캡슐화해요.
가장 간단한 사용 예시는 인자 없이 대상 객체의 메서드를 호출하는 리스너예요.
myButton.addActionListener(
(ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));
버튼을 누르면 frame.toFront()가 실행돼요.
이벤트 객체의 속성값을 대상 객체의 속성값으로 설정하는 것도 가능해요.
EventHandler.create(ActionListener.class, myButton, "nextFocusableComponent", "source")
이벤트 속성은 . 문자로 구분된 여러 개의 속성 접두사로 "한정(qualify)"할 수 있어요. 예를 들어 다음은 대상의 setA(e.getB().getC().isD())에 대응해요.
EventHandler.create(ActionListener.class, target, "a", "b.c.d")
관련 API는 Proxy, EventObject가 있어요. 이 클래스는 InvocationHandler를 구현해요.