2009-06-10 3 views
3

나는 Listener를 썼다. 이제 변경 사항이 발생할 때이를 알리고 싶습니다. 특별한 것은 없습니다.Java의 이벤트에 대한 표준 클래스가 있습니까?

이제 나 자신에게 묻습니다 : 사용할 수있는 이벤트의 표준 수업이 있습니까? 아니면 직접 작성해야합니까?

나는 java.awt.Event와 AWTEvent를 알고있다. 하지만 GUI 수준에서 직접 작업하지는 않습니다. 또한 우리는 GUI 레벨에서 스윙을 사용하고 있습니다. Swing과 AWT를 섞는 것이 좋은 생각이라면 나는 shure하지 않습니다.

Thx

답변

4

고대 간단하지만 java.util의 관찰자가/Obserable 사용할 수 그것 :

관찰 가능한 공용 클래스는 객체에게이 클래스는 관찰 객체를 나타냅니다

java.util의 확장 , 또는 "데이터"모델보기에서 패러다임. 응용 프로그램이 관찰하고자하는 개체를 나타내는 으로 서브 클래스화할 수 있습니다.

관찰 가능한 개체는 관찰자가 더 많을 수도 있습니다 (예 : ). 옵저버는 Observer 인터페이스를 구현하는 모든 개체가 될 수 있습니다. 관찰 가능한 인스턴스 이 변경된 후 관찰자의 notifyObservers 메서드 을 호출하는 응용 프로그램은 에 대한 호출로 변경 내용을 알리는 모든 관찰자가 이되도록합니다.

자세한 내용은 http://www.javaworld.com/javaworld/jw-10-1996/jw-10-howto.html을 참조하십시오.

2

Java의 이벤트에는 특별한 것이 없습니다. 이벤트가 GUI 이벤트가 아닌 경우 자신의 클래스를 사용하고 java.awt.Events과 섞지 않는 것이 덜 혼란 스럽습니다. 당신이 스윙을 사용하는 경우

2

, 당신은 EventBus에서 좀 걸릴 수 있습니다 :

이벤트 버스는 단일 프로세스가 스윙 확장을, 게시/라이브러리를 라우팅 이벤트를 구독 할 수 있습니다. EventBus는 완벽한 API 문서와 테스트 커버리지 (80 % 이상)를 갖춘 완벽한 기능을 제공합니다. 이 솔루션은 금융, 엔지니어링 및 과학 응용 프로그램을 포함한 많은 프로덕션 환경에 배포되었습니다.

0

스윙은 AWT를 기반으로하므로 혼합해야합니다. 이 문제는 AWT 중량급 구성 요소를 Swing 경량 구성 요소와 혼합 할 때 발생합니다. AWT 중량 구성 요소를 사용하지 마십시오.

그냥 무언가가 바뀌 었음을 알리면 javax.swing.event.ChangeListener이 좋습니다. 실제로 Bean 모델을 가정하는 라이브러리를 사용하지 않는 한 이벤트 클래스를 무시하고 이벤트 오브젝트없이 관찰자를 사용할 수 있습니다.

2

난 항상 EventObject을 내 사용자 지정 이벤트의 기본 클래스로 사용했습니다.다음은 JavaDoc에서 말하는 것입니다.

모든 이벤트 상태 객체를 파생시키는 루트 클래스.

모든 이벤트는 논리적으로 문제의 이벤트가 처음에 발생한시 객체로 간주되는 객체, '소스', 에 참조하여 구성된다.

+1

+1 그리고 자신의 이벤트를 조심하십시오. 가능한 경우 다른 Java 라이브러리에서 가능한 한 자세히 수행하십시오. 무언가가 Serializable 일 때, 해당 객체를 Serializable 등으로 만드십시오. 가능한 모든 곳에서 동일한 명명 패턴과 메소드를 사용하십시오. 손으로 뽑은 사건을 다루는 것은 상황에 따라 불쾌 할 수 있습니다. –

1

스윙 앱의 표준 솔루션 종류는 이벤트가 발생한 클래스의 이벤트 리스너 목록을 유지 관리하는 것입니다. 이벤트가 발생하면 목록을 반복하고 각 청취자에게 이벤트를 알립니다. 그래서 이런 식으로 뭔가 할 수있다 (필자는 액세스 한정자를 생략하고 간결에 대한 형식 선언의 일부) :

class SomeClassInWhichTheEventOccurs { 
    List<MyListener> listeners; 
    void addListener(listener) { listeners.add(listener); } 
    void removeListener(listener) { listeners.remove(listener); } 
    void fireEvent(someEventParameters) { 
     foreach (listener in listeners) listener.eventOccured(); 
    } 
    void someMethodInWhichTheEventOccurs() { 
     ... 
     fireEvent(someEventParameters); 
    } 
} 

이벤트 매개 변수는 무엇이든 할 수있다 : 당신은 당신의 자신의 이벤트 클래스, 재사용 java.awt의를 만들 수 있습니다 .Event 또는 임의의 유형의 일부 매개 변수를 전달하십시오.

관련 문제