2010-07-02 63 views
0

在我目前的項目中,我們正在使用我們的Swing客戶端以下模式:的Java Swing:保持事件處理maintanable

業務對象(PO​​JO)< - >(映射)< - >演示模型(POJO與財產變化支持)< - >(約束力)< - >查看組件

一切都很好,工作的方式,我們期待他們的行爲。

,但我們encouter這些問題時,觀點開始成長:

  1. 許多事件被觸發,導致級聯事件。一個字段上的一個更新可能會導致數十個後續屬性更新
  2. 當對話框複雜度增加時,監聽器的數量也會增加,並且代碼開始變得混亂且難以理解。第一個答案後

編輯:

  • 如果價值沒有改變,我們不火的事件。
  • 如果我們不需要它們,我們不會添加監聽器。

我們的屏幕非常複雜,需要其他相關面板的通知。所以我們有很多有用的監聽器,而且單個用戶的更改可以觸發許多潛在的事件。

將演示模型與業務模型綁定的想法對我們來說並不是那麼好:我們在映射過程中執行一些代碼。


我要找導遊,建議,最佳實踐等關於建立維護Swing應用程序,尤其是對事件的管理方。

回答

1

減少發送事件的數量有許多方法。

  1. 當沒有變化時不傳播事件。這個例子的一個典型例子就是寫一個觸發PropertyChangeEvent的setter的慣用方法(見下文),但是對於你手動觸發的所有類型的事件來說都是如此。

    public void setMyField(Object newValue) { 
     Object oldValue = myField; 
      if((oldValue==null && newValue!=null) || (oldValue!=null && !oldValue.equals(newValue))) { 
       myField = newValue; 
       propertyChangeSupport.firePropertyChange("myField", oldValue, newValue); 
      } 
     } 
    } 
  • 只有當你開始有興趣,併爲您不再是有意儘快註銷登記的事件監聽器。事實上,作爲一個傾聽者,甚至如果不採取行動,則強制JVm調用用於事件傳播的各種方法。不作爲監聽者將避免所有這些調用,並使應用程序變得簡單得多。

  • 考慮將POJO替換爲增加的POJO映射,方法是直接增加POJO實例。或者說簡單的事情:使用PropertyChangeEvent處理能力來製作POJO真正的java bean。爲了讓它們易於持久化,一個簡單的解決方案是,一旦「重新水合」或從持久層加載,就可以將持久性更新機制添加爲PropertyChangeListener。這樣,更新POJO時,會通知持久層,並以透明方式更新數據庫中的對象。

  • 所有這些都是非常簡單的建議,只需要大量的discpline,以確保事件只在正確的時間點擊,併爲正確的聽衆。

    1

    我建議每個模型的單個事件動作。不要試圖將它分解到無望的域名ProtpertyChangeListener。使用ChangeListener或您自己的等價物。 (老實說,事件參數沒有幫助。)或許將'property'類型改爲可監聽對象,而不是偵聽組合對象。

    +0

    你什麼時候決定啓動更改監聽器?如果你有一個擁有許多屬性的bean,並且有一些更新在一行中,你如何決定觸發一個更改事件而不是許多屬性更改事件? – Guillaume 2010-07-02 13:02:16

    +0

    每次手術射擊一次。如果源代碼是bean風格的,那麼每個'set'都會有一次。如果源以OO風格編寫,那麼事件就會減少。後期擔心合併(例如AWT將合併重新繪製)。 – 2010-07-03 11:44:04

    0

    大多數Swing組件使用的EventListenerList方案相當輕量級。在決定新架構之前,一定要對代碼進行剖析。除usual choices之外,此EventQueue子類example還提供了另一個監視事件流量的有趣方法。