我有一个简单的java swing应用程序。它主要在Macos上使用,因此我试图通过Desktop.getDesktop().setDefaultMenuBar(...)
向其添加默认菜单栏。我定义了带有“文件”菜单和带有动作监听器的“新建”菜单项的菜单栏。使用鼠标单击File-> New可以按预期调用侦听器的actionPerformed()
事件。
我试图将标准加速器附加到菜单项(在Mac上为Command-N)。现在,单击“文件”菜单上将显示“新建”,旁边带有预期的加速器。但是,当我实际键入Command-N时,不会调用动作侦听器。键入Command-N的唯一可见效果是“文件”菜单项短暂闪烁。
编辑:这似乎与通过Desktop.setDefaultMenuBar()
设置菜单有关。如果我将菜单附加到JFrame,则加速器可以正常工作。但是,我正在使用Desktop.setDefaultMenuBar()
定义即使在没有其他窗口打开的情况下也会出现的菜单。
import java.awt.Desktop;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class Scratch {
static class MainMenu extends JMenuBar implements ActionListener {
public MainMenu() {
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
int keyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx();
JMenuItem item = new JMenuItem("New");
item.setMnemonic(KeyEvent.VK_N);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, keyMask));
item.addActionListener(this);
fileMenu.add(item);
this.add(fileMenu);
}
@Override
public void actionPerformed(ActionEvent e) {
System.err.println("actionPerformed " + e);
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Hello Stackoverflow!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("Hello Stackoverflow!");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
Desktop.getDesktop().setDefaultMenuBar(new MainMenu());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
}
对Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()
的呼叫基于this blog entry。
任何人都可以看到我在做什么吗?
如果有问题,我正在与Amazon coretto 11进行测试。