是否为JMenuItem加速键击中动作事件?

时间:2019-09-27 15:33:56

标签: java swing jmenuitem jmenubar

我有一个简单的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进行测试。

0 个答案:

没有答案