最佳做法的双重态的行动
-
13-09-2019 - |
题
我最近实施了一个 Action
切换的启用状况的一个业务功能。每当的用户调用行动我设置一个布尔的标志:"willEnable"以确定是否下调用将启用或禁用的功能。同样,我更新的行动的名称、简短说明和图标,以反映新的状态。然后在我的 actionPerformed(...)
方法,我采取不同的行动基础的状态 willEnable
.
- 这是正确的做法,或者可以
任何人推荐一个更好的人(作为我
怀疑这是一个普遍的问题)?(我可以看到,
JToggleButton
行为 作为两个国家的按钮,但我想 这一行动可见一个JMenuBar
以及一个JButton
, 所以不要认为这是 合适的话)。
编辑
具体地说,如何做等应用程序的想法处理这个?他们会使用的多国家的行动(如上),或者将他们交换一个 不同的 Action
成给 JButton
使用 setAction(Action)
?也许这种方法是更好吗?
- 在更新行动的性质
我可以依靠GUI件
初始化与,
Action
(例如JButton
)自动重新粉刷 自己?如果有什么的JButton
尺寸变化的结果?我应该 可以重新验证将包含JPanel
我自己? - 是改变行动的是一个坏的名字
事情吗?这是唯一的办法了我
可以使JButton文本改变,但我意识这个名字很可能应该保持不变,如果该行动被放置在
ActionMap
.
在此先感谢。
解决方案
我希望,任何GUI成分,这是创建有一些数据"模型"(我将包括一个 Action
作为一个数据模型)的应登记册本身作为一个听众,这一模式。它的 必须 采取适当、机构风险管理行动 PropertyChangeEvent
被烧:任何其他行为将构成中的一个错误我的意见。
可疑的事情这里是它是否是合法的名称更改的行动;我认为, 这是不合法的.你的行动的逻辑是 ToggleEnabledStatus 这不会改变,因为该行动被援引。任何成分需要显示其他任何文本应登记册本身作为一个听到的 Action
然后检查你的 willEnable
标志采取的适当、机构风险管理行动。
或者你可以写你自己的类的实施 ToggleButtonModel
和 Action
在同一时间和控制的变化的事件。这是一个很大的代码,然而,对于这样一点好处
其他提示
你可能想看看 国家图案.
基本上,你创建的一个接口和两个(或更多)的实现它对每个国家。作为一个简单的例子,禁止状态可能只是实现接口什么也不做,同时启用的国家做了一些行动。到开关状态你只会做的
interface IState {
void doAction();
boolean isEnabled();
}
class EnabledState implement IState {
void doAction() {
setState(new DisabledState());
// do something
}
boolean isEnabled() {return true;}
}
class DisabledState implement IState {
void doAction() {
setState(new EnabledState());
// do nothing
}
boolean isEnabled() {return false;}
}
private IState state = new DisabledState(); // default is disabled
private PropertyChangeSupport support = new PropertyChangeSupport(this);
void setState(IState state) {
if (this.state != state) {
IState oldState = this.state;
this.state = state;
support.firePropertyChange("enabled", oldState.isEnabled(), state.isEnabled());
}
}
void doAction() {
state.doAction();
}
虽然这是一个小的开销为一个单一的方法,它肯定支付的,尽快为你有几种方法改变它的行为根据一个单一的国家。