이벤트 및 청취자

사용자 지정 이벤트를 생성하는 방법과 구성 요소가 이벤트를받을 수 있도록 어떻게 발생합니까?

맞춤 이벤트를보기 전에 기존 이벤트 인 ActionEvent.

같은과 같은 구성 요소 ButtonJButton떨어져 화재 ActionEvents구성 요소 정의 행동의 어떤 종류를 나타냅니다. 예를 들어 사용자가 누를 때마다이 Button실행됩니다 ActionEvent. 이벤트의 전체 요점은 GUI의 구성 요소에 문제가 발생했음을 리스너에게 알리는 것입니다. 이벤트에는 리스너가 무슨 일이 일어 났는지, 누구에게 일어 났는지 (이벤트의 내용과 대상)을 파악하는 데 필요한 모든 정보가 포함됩니다. 이벤트는 자신을 완전히 설명 할 수있는 충분한 정보를 제공해야합니다. 이렇게하면 청취자는 정확히 무슨 일이 일어 났는지 파악하고 의미있는 방식으로 대응할 수 있습니다.

ActionEvent작업의 명령 문자열, 수정 자 및 식별 문자열을 학습하는 방법 이 포함됩니다. 이 getActionCommand()메서드는 인쇄 또는 복사 (무엇)와 같은 이벤트의 의도 된 작업을 나타내는 명령 문자열을 반환합니다. 이 getSource()메서드는 이벤트를 생성하는 개체 (who)를 반환합니다.

를 수신하려면 ActionEvent리스너가 ActionListener인터페이스 를 구현 하고 구성 요소에 자신을 등록 해야합니다 . 또한 구성 요소는 이벤트를 알리기 위해 리스너를 추적해야합니다.

ActionEvent예제를 모델로 사용하면 구성 요소가 이벤트를 생성하고 리스너가 이벤트를 수신하는 데 필요한 부분을 쉽게 볼 수 있습니다. 높은 수준에서 세 가지 요소가 있습니다.

  1. 구성 요소
  2. 이벤트 클래스
  3. 리스너 인터페이스

각각 개별적으로 살펴 보겠습니다.

구성 요소

구성 요소는 이벤트를 생성합니다. 이벤트는 리스너에게 어떤 일이 발생했음을 알리는 구성 요소의 방법입니다. 따라서 구성 요소는 이벤트 리스너를 등록 및 등록 취소하는 메커니즘을 제공해야합니다. 또한 구성 요소는 리스너를 추적하고 해당 리스너에 이벤트를 전달해야합니다.

등록 / 해제 및 추적 메커니즘은 개별 구성 요소에 맡겨집니다. 그러나, 구성 요소를 일반적으로 가질 것이다 addXXXListenerremoveXXXListener이를 생성하는 이벤트의 유형별. 내부적으로 컴포넌트는 리스너를 저장할 수 있지만 선택합니다. 그러나 일반적으로 구성 요소는 리스너를 java.util.Vector또는에 저장 javax.swing.event.EventListenerList합니다. 리스너에게 이벤트를 시작하기 위해 구성 요소는 리스너 목록을 반복하고 리스너의 이벤트 전달 메서드를 호출하여 각 리스너에 이벤트를 전달합니다.

예를 들어 볼 시간입니다.

... EventListenerList xxxListeners = new EventListnerList(); public void addXXXListener(XXXListener listener) { xxxListeners.add(XXXListener.class, listener); } public void removeXXXListener(XXXListener listener) { xxxListeners.remove(XXXListener.class, listener); } protected void fireXXX(XXXEvent xxxEvent) { Object[] listeners = xxxListeners.getListenerList(); // loop through each listener and pass on the event if needed Int numListeners = listeners.length; for (int i = 0; i
    

This example shows how to register, deregister, and fire events of type XXXEvent. Listeners can register and deregister themselves through the addXXXListener() and removeXXXListener() methods. When an event occurs, the component creates an event object and passes it to the fireXXX() method, where it is passed to the listeners.

The example defines a generic recipe that all components can follow. However, in order for the example to work, you must define an XXXEvent and an XXXListener interface.

The event class

The event holds all of the information necessary for a listener to figure out what happened. The information included is really event specific. Just think about the event carefully and design the event class to hold whatever information is necessary to fully describe the event to a listener. Events normally extend the java.awt.AWTEvent event class.

The listener interface

An event listener interface defines the methods used by a component to dispatch events. Each event type will have at least one corresponding dispatch method in a listener interface.

A listener interface takes the following generic format:

public interface XXXListener extends EventListener { // event dispatch methods somethingHappened(XXXEvent e); somethingElseHappened(XXXEvent e); ... } 

To listen for an event, a listener must implement the XXXListener interface and register itself with the component. When an event occurs, the component will call the proper dispatch method. The methods are defined in an interface so that any object can receive the event. As long as the listener implements the interface, the component will know how to dispatch the event to the listener.

Wrap-up

As you can see, there are dependencies between some of the pieces. The listener interface corresponds directly to the event. The event is necessarily the dispatch method's argument.

The component corresponds directly with the event and listener. It needs to know about each so that it can create events, dispatch events, and register listeners.

Unlike the other two pieces, the event object is independent. As a result, many components are free to fire off the event type. Furthermore, multiple interfaces may define methods to dispatch the event.

Tony Sintes is a principal consultant at BroadVision. Tony, a Sun-certified Java 1.1 programmer and Java 2 developer, has worked with Java since 1997.

This story, "Events and listeners" was originally published by JavaWorld .