1

나는 자바 자습서를 온라인에서 살펴 봤고 이미 작성된 다른 구성 요소에 의해 주어진 ActionEvent를 잡는 것에 관심을 갖고있다. 리스너로 등록 된 다른 클래스에서 catch 할 수있는 actionEvents를 트리거하는 기준 세트가있는 고유 한 객체를 작성할 수 있습니까?ActionEvent를 제공하는 객체를 직접 작성할 수 있습니까?

그래서 예를 들어, 청중으로 등록한 모든 잠자는 개체에 양 100 마리가 포함되었을 때 양을 세고있는 개체에서 actionEvent를 보내고 싶었던 경우.

온라인 튜토리얼이 있습니까?

도움을 주시면 대단히 감사하겠습니다.

답변

2

예, 누군가가 자신 만의 청취자를 만드는 방법을 보여 주면 꽤 간단합니다.

먼저 자신 만의 EventObject를 만듭니다. 다음은 내 프로젝트 중 하나의 예입니다.

import gov.bop.rabid.datahandler.bean.InmateDataBean; 

import java.util.EventObject; 

public class InmatePhotoEventObject extends EventObject { 

    private static final long serialVersionUID = 1L; 

    protected InmateDataBean inmate; 

    public InmatePhotoEventObject(Object source) { 
     super(source); 
    } 

    public InmateDataBean getInmate() { 
     return inmate; 
    } 

    public void setInmate(InmateDataBean inmate) { 
     this.inmate = inmate; 
    } 

} 

EventObject를 확장하는 것 외에도이 클래스에는 특별한 것이 없습니다. 생성자는 EventObject에 의해 정의되지만 원하는 모든 메서드를 만들 수 있습니다.

둘째, EventListener 인터페이스를 정의합니다.

public interface EventListener { 

    public void handleEvent(InmatePhotoEventObject eo); 

} 

작성한 EventObject를 사용합니다. 원하는 메서드 이름을 사용할 수 있습니다. 이것은 청취자에 대한 응답으로 작성되는 코드 용 인터페이스입니다.

세 번째로 ListenerHandler를 작성합니다. 여기에 같은 프로젝트의 것이 있습니다.

import gov.bop.rabid.datahandler.bean.InmateDataBean; 
import gov.bop.rabid.datahandler.main.EventListener; 
import gov.bop.rabid.datahandler.main.InmatePhotoEventListener; 
import gov.bop.rabid.datahandler.main.InmatePhotoEventObject; 

import java.util.ArrayList; 
import java.util.List; 

public class InmatePhotoListenerHandler { 

    protected List<EventListener> listeners; 

    public InmatePhotoListenerHandler() { 
     listeners = new ArrayList<EventListener>(); 
    } 

    public void addListener(EventListener listener) { 
     listeners.add(listener); 
    } 

    public void removeListener(EventListener listener) { 
     for (int i = listeners.size() - 1; i >= 0; i--) { 
      EventListener instance = listeners.get(i); 
      if (instance.equals(listener)) { 
       listeners.remove(i); 
      } 
     } 
    } 

    public void fireEvent(final InmatePhotoEventObject eo, 
      final InmateDataBean inmate) { 
     for (int i = 0; i < listeners.size(); i++) { 
      final EventListener instance = listeners.get(i); 
      Runnable runnable = new Runnable() { 
       public void run() { 
        eo.setInmate(inmate); 
        instance.handleEvent(eo); 
       } 

      }; 
      new Thread(runnable).start(); 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println("This line goes in your DataHandlerMain class " 
       + "constructor."); 
     InmatePhotoListenerHandler handler = new InmatePhotoListenerHandler(); 
     System.out.println("I need you to put the commented method in " 
       + "DataHandlerMain so I can use the handler instance."); 

     // public InmatePhotoListenerHandler getInmatePhotoListenerHandler() { 
     //  return handler; 
     // } 

     System.out.println("This line goes in the GUI code."); 
     handler.addListener(new InmatePhotoEventListener()); 

     System.out.println("Later, when you've received the response from " 
       + "the web service..."); 
     InmateDataBean inmate = new InmateDataBean(); 
     inmate.setIntKey(23); 
     handler.fireEvent(new InmatePhotoEventObject(handler), inmate); 
    } 
} 

이 클래스의 주된 메소드는 ListenerHandler를 사용하는 방법을 보여줍니다. 클래스의 나머지 메소드는 표준입니다. 당신은 당신 자신의 EventObject와 EventListener를 사용할 것이다.

0

예.

ActionEvent 및 EventListenerList에 대한 Java API 설명서를 살펴 보시기 바랍니다.

또한 Listener (Observer라고도 함) 패턴에 대해 읽는 것이 좋습니다.

관련 문제