我编写了一个 Swing GUI,其中包含与同一Action
子类关联的多个控件。子类的实现Action
遵循这个伪代码:
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_;
};
该操作与按钮和菜单项相关联,其方式类似于以下伪代码:
act_ = new Action_StartPlayback(/*...*/);
// ...
JButton btn = new JButton(act_);
JMenu mnu = new JMenu(act_);
当我单击按钮或菜单项时,动作actionPerformed
被正确触发, gizmo_
被初始化并且是非null
并且一切都按预期工作 - 除了按钮和菜单项仍然启用。
我预计isEnabled
会再次“自动”调用,但这显然不会发生。 isEnabled()
再也不会被调用。
这引发了两个问题:
- 像我在这里所做
@Override
的那样对我来说可以吗?isEnabled()
- 假设 #1 的答案是肯定的,我如何触发 GUI 的刷新以便
isEnabled()
再次调用,从而导致按钮和菜单项被禁用?