双态行动的最佳方法

时间:2009-11-03 13:24:49

标签: java swing event-handling action

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

  1. 这是正确的方法还是可以 任何人都推荐一个更好的(因为我 怀疑这是一个常见的问题)? (我可以看到JToggleButton行为 作为一个双状态按钮但我想要 这个动作在a上可见 JMenuBar以及JButton, 所以不要以为这是 适当)。
  2. 修改

    具体来说,像IDEA这样的应用程序如何应对?他们会使用多州行动(如上所述),还是会使用Action不同的JButton 交换到给定的setAction(Action)?也许这种方法更好?

    1. 更新操作的属性时 我可以依赖GUI组件吗? 用Action初始化(例如 JButton)自动重新绘制 他们自己?如果JButton怎么办? 尺寸会因此而改变吗?我是不是该 重新验证包含 JPanel我自己?
    2. 更改动作的名称是不好的 要做的事?这是我的唯一方式 可以使JButton文本发生变化,但我很有意思,如果将动作放在ActionMap中,名称应该保持不变。
    3. 提前致谢。

2 个答案:

答案 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标志以采取适当的行动。

或者,您可以编写自己的类,同时实现ToggleButtonModelAction并控制其中的更改事件。然而,这是很多代码,因为这样的好处