我编写了一个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()永远不会再被召唤.
这引出了两个问题:
@Override的isEnabled()方法对我来说可以吗?isEnabled()再次调用,导致按钮和菜单项被禁用?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,它根据此操作通知组件状态已更改,以便组件可以相应地更新其自己的状态。