java - AbstractionAction 的 putValue() 方法是否适用于 JMenuItem 等的子类?

标签 java swing

也许这是个坏主意,但我为 JMenuItem 写了一个子类添加一个新的构造函数。我们称它为 JMenuItemX:

import java.awt.event.ActionListener;
import javax.swing.JMenuItem;

@SuppressWarnings("serial")
public class JMenuItemX extends JMenuItem
{
  public JMenuItemX(final String the_text, final char the_mnemonic,
                    final ActionListener the_action)
  {
    super(the_text);
    setMnemonic(the_mnemonic);
    addActionListener(the_action);
  }
}

现在,我正在尝试使用 AbstractAction 向组件添加工具提示。 :

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;

@SuppressWarnings("serial")
public class AboutAction extends AbstractAction
{

  public AboutAction()
  {
    super("About");
    putValue(SHORT_DESCRIPTION, "Show the popup window");
  }

  @Override
  public void actionPerformed(final ActionEvent the_event)
  {
    JOptionPane.showMessageDialog(null, "Hello World!");
  }
}

并如此构建组件(JFrame、JMenuBar 和 JMenu 已设置好):

menu.add(new JMenuItemX("About", 'a', new AboutAction()));

(如您所见,如果我要添加多个菜单项,这种单行格式更易于阅读。)


菜单项可见且文本正确,助记符和操作按预期工作。但是没有工具提示...但是,如果我只使用 JMenuItem,工具提示就可以工作!

JMenuItem about = new JMenuItem(new AboutAction());
about.setMnemonic('a');
menu.add(about);

如何让 AbstractAction 与我的 JMenuItem 子类一起工作?

最佳答案

您重写的构造函数不使用 JMenuItem 构造函数以 Action 作为参数,也不调用 setAction()。因此,您的菜单项与操作无关。

我不会为了添加构造函数而创建子类。为什么不简单地创建一个工厂方法?

public JMenuItem createMenuItemWithListener(String text, 
                                            char mnemonic, 
                                            ActionListener action) {
    JMenuItem result = new JMenuItem(text);
    result.setMnemonic(mnemonic);
    result.addActionListener(action);
    return result;
}

public JMenuItem createMenuItemWithAction(char mnemonic, 
                                          Action action) {
    JMenuItem result = new JMenuItem(action);
    result.setMnemonic(mnemonic);
    return result;
}

关于java - AbstractionAction 的 putValue() 方法是否适用于 JMenuItem 等的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10671225/

相关文章:

java - swing - 如何使用按钮切换 JPanel

java泛型和扩展

java - JPanel 无法从 JFrame 打开

java - IntelliJ mac JRE 主页

java - 在 Velocity 模板中传递 Java 函数

java - 如何使用 Android Studio 安装 Android 库?

java - 图像是如何渲染到屏幕上的?

java - 如何获取导致 NumberFormatException 的文本字段?

java - Swing 线程违规

java - HashMap 到 JTable