在Swing Gui中,每个组件都按照设计引用自己的数据模型来显示数据。虽然他们没有提到一个共同的模型,但有时组件可以 是"依赖"因为程序的语义而彼此相对。
例如:如果Gui有一个显示/隐藏表和另一个JButton的JToggleButton, 其actionListener计算该表中的行,后者必须在未选择前者时禁用(并且表不可见)。确实 - 让我们假设计算不可见表的行可能会导致状态不一致。比方说,那就是 当表被隐藏时,JButton的actionListener会对设置为null的变量调用方法。
我知道这是一个非常简单的例子。但是经常发生在我身上的事情,我不得不关注组件之间的所有这些依赖关系。我不得不禁用一些组件,以防止用户通过在错误的时间点击错误的按钮使程序进入不一致的状态。
因此,我开始想知道是否有更有条理和更标准的方法来解决这个问题,而不仅仅是通过代码浏览并放置一些setEnable(false),在这里和那里,我注意到存在依赖。< / p>
我认为,一种方法可能是拥有一个布尔值的依赖矩阵:接口的每个可能状态为一行,接口的每个组件为一列。 matrix [i] [j] 将 true 如果处于 i 状态,则必须禁用组件 j 。否则, false 。
你怎么看待它?是否有任何设计模式来解决这个问题?欢呼声
答案 0 :(得分: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);
}
}
}