簡體   English   中英

Java Swing:使事件處理可維護

[英]Java Swing: keeping the event handling maintanable

在我當前的項目中,我們為Swing客戶端使用以下模式:

業務對象(PO​​JO)<->(映射)<->表示模型(具有屬性更改支持的POJO)<->(綁定)<->視圖組件

一切都很好,並且以我們期望他們的行為方式運行。

但是,當視圖開始增長時,我們會解決那些問題:

  1. 觸發了許多事件,從而導致級聯事件。 一個字段的一次更新可能會導致隨后的許多屬性更新
  2. 當對話框的復雜性增加時,偵聽器的數量也會增加,並且代碼開始變得混亂且難以理解。

在第一個答案后編輯:

  • 如果價值沒有變化,我們不會觸發事件。
  • 如果我們不需要監聽器,則不添加監聽器。

我們的屏幕包含非常復雜的規則,並且需要其他相關面板的通知。 因此,我們有很多有用的偵聽器,單個用戶的更改可以觸發許多基礎事件。

將表示模型與業務模型綁定在一起的想法對我們而言不是那么好:我們在映射過程中執行一些代碼。


我正在尋找有關構建可維護的Swing應用程序的指南,建議,最佳實踐等,尤其是在事件管理方面。

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

  1. 沒有更改時,請勿傳播事件。 這是一個典型的ios例子,它是編寫觸發Setter來觸發PropertyChangeEvent的慣用方式(請參閱下文),但是您手動觸發的所有事件都是這種情況。

    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);
            }
        }
    }
  1. 僅在您開始感興趣時才注冊為事件偵聽器,並在您不再感興趣時立即注銷。確實,作為偵聽器,即使不采取任何措施,也會迫使JVm調用用於事件傳播的各種方法。 。 不做監聽者將避免所有這些調用,並使應用程序更加簡單。

  2. 考慮通過直接實例化增加的POJO將POJO替換為增加的POJO映射。 或者,更簡單地說:使您的POJO真實Java Bean具有PropertyChangeEvent處理功能。 為了使它們易於持久保存,一種簡單的解決方案是,一旦“重新水化”或從持久層加載后,添加一個持久性更新程序機制作為PropertyChangeListener。 這樣,當更新POJO時,將通知持久層,並透明地更新DB中的對象。

所有這些都是非常簡單的建議,只需要很大的紀律,即可確保僅在正確的時間針對正確的聽眾觸發事件。

我建議每個模型執行一次事件操作。 不要嘗試使用無望的ProtpertyChangeListener將其分解為多個字段。 使用ChangeListener或您自己的等效項。 (坦率地說,事件參數沒有幫助。)也許將“屬性”類型更改為可聽對象,而不是偵聽復合對象。

大多數Swing組件使用的EventListenerList方案相當輕巧。 在決定采用新的體系結構之前,請確保對代碼進行概要分析。 除了通常的選擇之外 ,此EventQueue子類示例還建議了另一種有趣的監視事件流量的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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