2

在Swing Gui中,每個組件都通過設計引用其自己的數據模型以顯示數據。儘管它們沒有引用通用模型,但由於程序的語義,有時組件可能會互相「依賴」。gui組件之間依賴關係的模式

例如:如果Gui有一個JToggleButton顯示/隱藏表和另一個JButton, 其actionListener計算該表中的行,當前者未被選中時,後者必須被禁用(並且表不可見)。事實上 - 假設 - 計算不可見表格的行可能會導致不一致的狀態。比如說,當表被隱藏時,JButton的actionListener調用一個設置爲null的變量的方法。

我知道這是一個非常微不足道的例子。但是我經常發現,我不得不查看組件之間的所有依賴關係。而且我必須禁用一些組件,以防止用戶通過在錯誤的時間點擊錯誤的按鈕而將程序帶入不一致的狀態。因此,我開始想知道是否有更有組織和標準的方法來解決這個問題,而不僅僅是瀏覽代碼並將一些setEnable(false),在這裏和那裏,我注意到有一個依賴關係。

一種方法,我想可能是有一個布爾值的依賴矩陣:接口的每個可能狀態爲一行,接口的每個組件爲一列。 矩陣[i] [j]如果在狀態,組分Ĵ必須被禁止。和否則爲

你對此有何想法?有什麼樣的設計模式可以解決這個問題嗎?

歡呼

+2

我傾向於使用事件總線來解決這些類型的問題。它們允許鬆散耦合的代碼 - 參與方不需要了解彼此,只是事件本身。我已經使用谷歌番石榴和大使提供的巨大效果。我會說最好避免使用大量的布爾矩陣。 –

回答

0

我不完全相信你你的「我的狀態」,怎麼一般或混凝土,這是什麼意思。在某些情況下,您可以使用如下所示的簡單幫助對象,併爲每個觀察狀態提供一個實例。您所依賴的狀態的組件對相關組件沒有編譯時間依賴性,但會引用其DependentComponents實例。

import java.awt.Component; 
import java.util.HashSet; 
import java.util.Set; 

/** 
* Handles components which are enabled/disabled based on some condition 
*/ 
public class DependentComponents { 
    /** 
    * Internal set of components handled by this object 
    */ 
    final private Set<Component> components = new HashSet<>(); 

    /** 
    * Each dependent component should be added to the set by this method 
    * 
    * @param component A component which is to be added 
    */ 
    public void register(final Component component) { 
     this.components.add(component); 
    } 

    /** 
    * Enables or disables all the components, depending on the value of the parameter b. 
    * 
    * @param b If <code>true</code>, all the components are enabled; otherwise they are disabled 
    */ 
    public void setEnabled(boolean b) { 
     for (Component component : this.components) { 
      component.setEnabled(b); 
     } 
    } 
}