动作事件未为JMenuItem加速键击中吗?

问题描述 投票:0回答:1

我有一个简单的java swing应用程序。它主要在Macos上使用,因此我试图通过Desktop.getDesktop().setDefaultMenuBar(...)向其添加默认菜单栏。我定义了带有“文件”菜单和带有动作监听器的“新建”菜单项的菜单栏。使用鼠标单击“文件”->“新建”,将按预期调用侦听器的actionPerformed()事件。

我尝试将标准加速器附加到菜单项(在Mac上为Command-N)。现在,单击“文件”菜单上将显示“新建”,旁边带有预期的加速器。但是,当我实际键入Command-N时,不会调用动作侦听器。键入Command-N的唯一可见效果是“文件”菜单项短暂闪烁。

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

谁能看到我在做什么错吗?

java swing jmenuitem jmenubar
1个回答
0
投票

您尝试使用Desktop.getDesktop().setDefaultMenuBar(...)而不是frame.setJMenuBar(new MainMenu());对我来说没问题:

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().getMenuShortcutKeyMask();

            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);
        frame.setJMenuBar(new MainMenu());
        JLabel label = new JLabel("Hello Stackoverflow!");
        frame.getContentPane().add(label);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.