Java 不可见JMenuBar,加速器不工作

Java 不可见JMenuBar,加速器不工作,java,actionlistener,hotkeys,jmenubar,Java,Actionlistener,Hotkeys,Jmenubar,我的程序有一个带有JMenuItems的JMenuBar。 他们有一个ActionListener,我用setAccelerator设置了一个快捷方式。 现在,当窗口不聚焦时,我隐藏菜单栏,以便为显示的图像获得更多空间。 但是在第一次隐藏菜单栏之后,热键就停止工作了 我怎样才能解决这个问题 我创建了一个小示例代码来说明这种奇怪的行为: import javax.swing.*; import java.awt.event.*; class Example extends JFrame{

我的程序有一个带有
JMenuItem
s的
JMenuBar
。 他们有一个
ActionListener
,我用
setAccelerator
设置了一个快捷方式。 现在,当窗口不聚焦时,我隐藏菜单栏,以便为显示的图像获得更多空间。 但是在第一次隐藏菜单栏之后,热键就停止工作了

我怎样才能解决这个问题

我创建了一个小示例代码来说明这种奇怪的行为:

import javax.swing.*;
import java.awt.event.*;

class Example extends JFrame{
    public static void main(String[] args) {
        new Example(); //main is static
    }
    static JMenuBar menubar; //be accessable for the ActionListener
    Example() {
        //JPanel
        this.setSize(50,50);
        this.setVisible(true);  

        //Menubar, static
        menubar = new JMenuBar();
        this.setJMenuBar(menubar);

        //Menu
        JMenu filemenu = new JMenu("File");
        menubar.add(filemenu);

        //Item
        JMenuItem menuitem = new JMenuItem("Do Something...");
        filemenu.add(menuitem);
        menuitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.SHIFT_DOWN_MASK)); // Shift + D
        menuitem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Action!");
            }
        });

        JButton button = new JButton("Show/Hide menubar");
        this.add(button);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Toggle Bar!");
                menubar.setVisible(!menubar.isVisible()); //Toggle
            }
        });
    }
}
供参考: 我正在Mac上使用Java1.7.0_60-ea(Java7)。
但此错误的发生与在JFrame中使用Mac本机菜单栏或普通java菜单栏无关。

您可以尝试添加全局键绑定。说明了如何添加键绑定

以下是您可以做的一个示例:

//Any component that is always visible in the window (like the image)
JComponent c;
//Get input and action map
InputMap imap = c.getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap amap = c.getActionMap();
//Put keybinding and action
imap.put(KeyStroke.getKeyStroke("shift D"), "doSomething");
amap.put("doSomething", anAction);
请注意,它仅在聚焦窗口中工作。但无论菜单栏是否可见,都应该工作