我最近实施了一个 Action 切换的启用状况的一个业务功能。每当的用户调用行动我设置一个布尔的标志:"willEnable"以确定是否下调用将启用或禁用的功能。同样,我更新的行动的名称、简短说明和图标,以反映新的状态。然后在我的 actionPerformed(...) 方法,我采取不同的行动基础的状态 willEnable.

  1. 这是正确的做法,或者可以 任何人推荐一个更好的人(作为我 怀疑这是一个普遍的问题)?(我可以看到, JToggleButton 行为 作为两个国家的按钮,但我想 这一行动可见一个 JMenuBar 以及一个 JButton, 所以不要认为这是 合适的话)。

编辑

具体地说,如何做等应用程序的想法处理这个?他们会使用的多国家的行动(如上),或者将他们交换一个 不同的 Action 成给 JButton 使用 setAction(Action)?也许这种方法是更好吗?

  1. 在更新行动的性质 我可以依靠GUI件 初始化与, Action (例如JButton)自动重新粉刷 自己?如果有什么的 JButton 尺寸变化的结果?我应该 可以重新验证将包含 JPanel 我自己?
  2. 是改变行动的是一个坏的名字 事情吗?这是唯一的办法了我 可以使JButton文本改变,但我意识这个名字很可能应该保持不变,如果该行动被放置在 ActionMap.

在此先感谢。

有帮助吗?

解决方案

我希望,任何GUI成分,这是创建有一些数据"模型"(我将包括一个 Action 作为一个数据模型)的应登记册本身作为一个听众,这一模式。它的 必须 采取适当、机构风险管理行动 PropertyChangeEvent 被烧:任何其他行为将构成中的一个错误我的意见。

可疑的事情这里是它是否是合法的名称更改的行动;我认为, 这是不合法的.你的行动的逻辑是 ToggleEnabledStatus 这不会改变,因为该行动被援引。任何成分需要显示其他任何文本应登记册本身作为一个听到的 Action 然后检查你的 willEnable 标志采取的适当、机构风险管理行动。

或者你可以写你自己的类的实施 ToggleButtonModelAction 在同一时间和控制的变化的事件。这是一个很大的代码,然而,对于这样一点好处

其他提示

你可能想看看 国家图案.

基本上,你创建的一个接口和两个(或更多)的实现它对每个国家。作为一个简单的例子,禁止状态可能只是实现接口什么也不做,同时启用的国家做了一些行动。到开关状态你只会做的

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

虽然这是一个小的开销为一个单一的方法,它肯定支付的,尽快为你有几种方法改变它的行为根据一个单一的国家。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top