簡體   English   中英

Java中的MVC和事件監聽器

[英]MVC and event listeners in Java

我對如何在模型和控制器之間使用事件監聽器感到困惑。 我正在開發一個應用程序,在客戶端我分為兩部分:客戶端本身,它與服務器和GUI進行所有通信。 客戶端從服務器觸發有關更新的事件,並且gui觸發有關服務器感興趣的用戶操作的事件(該應用程序基本上是一個多用戶圖形編輯器)。 所以我的問題:

  1. 我發現GU​​I更容易保持對客戶端的引用,反之亦然,而不是觸發事件和使用事件偵聽器。 這通常是一種不好的做法嗎?

  2. 現在,如果我們實際使用事件,我會對實現感到困惑。 所以我創建了一些我將要新的事件(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM