也许这是个坏主意,但我为 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/