1

也许这是一个坏主意,但我为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 子类一起使用?

4

1 回答 1

3

您重写的构造函数不使用 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;
}
于 2012-05-20T06:27:24.227 回答