java—双状态操作的最佳方法

toe95027  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(642)

我最近实施了一个 Action 切换业务功能的启用状态。每当用户调用该操作时,我设置一个布尔标志:“willenable”来确定下一次调用是启用还是禁用该函数。同样地,我更新动作名称、简短描述和图标以反映新的状态。然后在我的 actionPerformed(...) 方法我会根据 willEnable .
这是正确的方法还是有人能推荐一个更好的方法(我怀疑这是一个常见的问题)(我看得出来 JToggleButton 作为一个两态按钮,但我希望这个行动是在一个可见的 JMenuBar 以及 JButton ,因此不认为这是合适的)。
编辑
具体来说,像idea这样的应用程序如何处理这个问题?他们会使用多状态操作(如上所述)还是交换不同的 Action 变成一个给定的 JButton 使用 setAction(Action) ? 也许这种方法更好?
当更新一个动作的属性时,我可以依赖用它初始化的gui组件吗 Action (例如。 JButton )自动重新绘制自己?如果 JButton 尺寸会因此改变吗?我应该重新验证 JPanel 我自己?
更改动作名称是件坏事吗?这是我唯一可以更改jbutton文本的方法,但是我很清楚,如果操作被放置在 ActionMap .
提前谢谢。

jgzswidk

jgzswidk1#

我希望任何用数据“模型”创建的gui组件(我将包括 Action (作为数据模型)应该将自己注册为该模型的侦听器。它必须采取适当的行动 PropertyChangeEvent 被解雇:在我看来,任何其他行为都将构成一个错误。
这里值得怀疑的是,改变行为名称是否合法;我认为这是不合法的。您的操作在逻辑上是toggleenabledstatus,并且不会因为已调用该操作而更改。任何需要显示任何其他文本的组件都应该将自己注册为 Action 然后检查你的 willEnable 标志以采取适当的,呃,行动。
或者,您可以编写自己的实现 ToggleButtonModel 以及 Action 同时从内部控制变更事件。然而,这是很多代码,几乎没有什么好处

nbnkbykc

nbnkbykc2#

您可能需要查看状态模式。
基本上,为每个状态创建一个接口和两个(或更多)接口实现。举个简单的例子,disable状态可能只是实现接口,使其不做任何事情,而enabled状态执行一些操作。要切换状态,只需执行以下操作

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

虽然对于单个方法来说这是一点开销,但是只要您有几个方法根据单个状态改变它的行为,就一定会有回报。

相关问题