我最近实施了一个Action
来切换业务功能的启用状态。每当用户调用操作时,我都会设置一个布尔标志:“ willEnable ”以确定下一次调用是启用还是禁用该功能。同样,我更新动作名称,简短描述和图标以反映新状态。然后在我的actionPerformed(...)
方法中,我根据willEnable
的状态采取不同的操作。
JToggleButton
行为
作为一个双状态按钮但我想要
这个动作在a上可见
JMenuBar
以及JButton
,
所以不要以为这是
适当)。修改
具体来说,像IDEA这样的应用程序如何应对?他们会使用多州行动(如上所述),还是会使用Action
将不同的JButton
交换到给定的setAction(Action)
?也许这种方法更好?
Action
初始化(例如
JButton
)自动重新绘制
他们自己?如果JButton
怎么办?
尺寸会因此而改变吗?我是不是该
重新验证包含
JPanel
我自己?ActionMap
中,名称应该保持不变。提前致谢。
答案 0 :(得分:3)
您可能需要查看State Pattern。
基本上,您为每个州创建一个接口和两个(或更多)实现。举一个简单的例子,禁用状态可能只是实现接口在启用状态执行某些操作时不执行任何操作。要切换状态,您只需执行
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();
}
虽然单个方法的开销有点小,但只要有几种方法可以根据单个状态改变它的行为,它肯定会付出代价。
答案 1 :(得分:2)
我希望用一些数据“模型”创建的任何GUI组件(我将Action
作为数据模型包含)应该将自己注册为该模型的监听器。 必须对PropertyChangeEvent
被触发采取适当的行动:在我看来,任何其他行为都会构成错误。
这里值得怀疑的是改变行动的名称是否合法;我认为它不合法。您的操作在逻辑上是 ToggleEnabledStatus ,并且由于已调用该操作,因此不会更改。任何需要显示任何其他文本的组件都应将自己注册为Action
的监听器,然后检查您的willEnable
标志以采取适当的行动。
或者,您可以编写自己的类,同时实现ToggleButtonModel
和Action
并控制其中的更改事件。然而,这是很多代码,因为这样的好处