【发布时间】:2012-07-09 15:59:13
【问题描述】:
我编写了一个 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() 再也不会被调用。
这引发了两个问题:
- 我可以像我在这里所做的那样使用
@OverrideisEnabled()方法吗? - 假设 #1 的答案是肯定的,我如何触发 GUI 刷新以便再次调用
isEnabled(),从而导致按钮和菜单项被禁用?
【问题讨论】:
-
我可能会建议尽快发布SSCCE 以获得更好的帮助
-
@DavidKroukamp:我可以做到,但需要一些时间。拥有其他 GUI 框架(如 MFC)的经验,我曾预计这将是大多数 Java GUI 程序员面临的一项相当基本的任务。或许事实并非如此。