[英]MVC and event listeners in Java
我對如何在模型和控制器之間使用事件監聽器感到困惑。 我正在開發一個應用程序,在客戶端我分為兩部分:客戶端本身,它與服務器和GUI進行所有通信。 客戶端從服務器觸發有關更新的事件,並且gui觸發有關服務器感興趣的用戶操作的事件(該應用程序基本上是一個多用戶圖形編輯器)。 所以我的問題:
我發現GUI更容易保持對客戶端的引用,反之亦然,而不是觸發事件和使用事件偵聽器。 這通常是一種不好的做法嗎?
現在,如果我們實際使用事件,我會對實現感到困惑。 所以我創建了一些我將要新的事件(drawEvent,connectionEvent等)。 然后我實現了ClientListener和具有特定行為的GUIListener。 現在,我如何解雇事件? 從閱讀開始,我明白,為了讓GUI能夠觸發需要調用clientListener.eventHappened(event)的東西,對吧? 所以它需要有那個監聽器,即客戶端和GUI必須共享監聽器(似乎更復雜,只是引用)? 最后,我如何實際向gui添加GUIListener的實例? 從我讀到的內容中,我必須創建一個EventListenerList屬性,並在那里添加一個GUI監聽器的新實例? 是嗎? 我不知道這會如何引發實際聆聽。
對不起,我只是在學習所有這些東西,並沒有完全理解。 謝謝!
不確定你的設計是否最好,但編寫自己的聽眾/事件相當容易。
例如。 首先為偵聽器定義接口,為事件定義類
public class MyCustomEvent extends EventObject{
//store all relevant info in your event
}
public interface MyListener{
public void eventHappened( MyCustomEvent event);
}
然后,如果你有一個你想要附加監聽器的類,你只需要有方法來添加監聽器,並在需要時調用那些監聽器上的eventHappened
方法
public class MyClassWhichFiresEvents{
private final List<MyListener> listeners =
new CopyOnWriteArrayList<MyListener>();
public void addListener( MyListener listener ){
listeners.add( listener );
}
public void removeListener( MyListener listener ){
listeners.remove( listener );
}
//call this method whenever you need to fire an event
private void fireEvent( MyCustomEvent event ){
for ( MyListener listener : listeners ){
listener.eventHappened( event );
}
}
}
如果您想知道CopyOnWriteArrayList
來存儲偵聽器。 當您遍歷偵聽器以觸發事件時,其中一個偵聽器可能會自行刪除。 因此,典型的解決方案是首先將所有偵聽器復制到另一個列表中,然后迭代該列表,或使用CopyOnWriteArrayList
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.