gpt4 book ai didi

java - 双态 Action 的最佳方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:01 28 4
gpt4 key购买 nike

我最近实现了一个 Action 来切换业务功能的启用状态。每当用户调用该操作时,我都会设置一个 boolean 标志:“willEnable”以确定下一次调用是启用还是禁用该功能。同样,我更新了 Action 名称、简短描述和图标以反射(reflect)新状态。然后在我的 actionPerformed(...) 方法中,我根据 willEnable 的状态采取不同的操作。

  1. 这是正确的方法还是可以谁推荐一个更好的(因为我怀疑这是一个常见问题)?(我可以看到 JToggleButton 行为作为一个双态按钮,但我想要此操作在JMenuBar 以及一个 JButton,所以不要认为这是适当的)。

编辑

具体来说,像 IDEA 这样的应用程序是如何处理这个问题的?他们会使用多状态 Action (如上所述)还是会使用 setAction(Action )?也许这种方法更好?

  1. 更新 Action 的属性时我可以依赖 GUI 组件吗使用该 Action 初始化(例如JButton) 自动重绘他们自己?如果 JButton 会怎样大小因此而改变?我是不是该正在重新验证包含JPanel 我自己?
  2. 改变 Action 的名字不好吗要做的事?这是我唯一的方法可以更改 JButton 文本,但我知道如果将操作放在 ActionMap 中,名称可能应该保持不变。

提前致谢。

最佳答案

您可能想查看 State Pattern .

基本上,您为每个状态创建一个接口(interface)和它的两个(或更多)实现。举个简单的例子,禁用状态可能只是实现接口(interface)什么都不做,而启用状态则执行一些操作。要切换状态,你只需要做

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();
}

虽然对于单个方法来说这是一个小开销,但只要您有多个方法根据单个状态更改它的行为,它肯定会付出代价。

关于java - 双态 Action 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com