自动更新Action的isEnabled()

Joh*_*ing 6 java swing

我编写了一个Swing GUI,其中包含与同一Action个子类关联的多个控件.Action子类的实现遵循以下psudocode:

public class MyGUI 
{
  Gizmo gizmo_;  // Defined elsewhere

  public class Action_StartPlayback extends AbstractAction 
  {
    /* ctor */
    public Action_StartPlayback(String text, ImageIcon icon, String desc, Integer mnem)
    {
      super(text, icon);
      putValue(SHORT_DESCRIPTION, desc);
      putValue(MNEMONIC_KEY, mnem);
    }

    @Override public boolean isEnabled()
    {
      return gizmo_ == null;
    }
    @Override public void actionPerformed(ActionEvent e) 
    {
      gizmo_ = new Gizmo();
    }

  Action_StartPlayback act_;
};
Run Code Online (Sandbox Code Playgroud)

该操作与按钮和菜单项相关联,其方式与此psudocode类似:

act_ = new Action_StartPlayback(/*...*/);
// ...
JButton btn = new JButton(act_);
JMenu mnu = new JMenu(act_);
Run Code Online (Sandbox Code Playgroud)

当我单击按钮或菜单项时,操作actionPerformed被正确触发, gizmo_初始化并且为非,null并且一切都按预期工作 - 除了按钮和菜单项仍然启用.

我预计isEnabled会再次"自动"调用,但这显然不会发生. isEnabled()永远不会再被召唤.

这引出了两个问题:

  1. 我在这里做@OverrideisEnabled()方法对我来说可以吗?
  2. 假设#1的答案是肯定的,我如何触发GUI的刷新以便isEnabled()再次调用,导致按钮和菜单项被禁用?

dar*_*rri 3

setEnabled您可以setEnabled(false)在方法中初始化小工具后简单地调用,而不是覆盖actionPerformed

@Override public void actionPerformed(ActionEvent e) 
{
  gizmo_ = new Gizmo();
  setEnabled(false);
}
Run Code Online (Sandbox Code Playgroud)

这是setEnabled来自的实现AbstractAction

public void setEnabled(boolean newValue) {
  boolean oldValue = this.enabled;
  if (oldValue != newValue) {
    this.enabled = newValue;
    firePropertyChange("enabled", 
            Boolean.valueOf(oldValue), Boolean.valueOf(newValue));
  }
}
Run Code Online (Sandbox Code Playgroud)

您正在寻找的自动功能是对 的调用firePropertyChange,它根据此操作通知组件状态已更改,以便组件可以相应地更新其自己的状态。