我的计划有一个JMenuBar
JMenuItem
秒。
他们有一个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上使用Java 1.7.0_60-ea(Java 7)。 但是,此错误的发生与使用Mac本机菜单栏或JFrame中的普通Java菜单栏无关。
答案 0 :(得分:1)
您可以尝试添加全局键绑定。如何添加键绑定解释here。
以下是您可以执行的操作示例:
//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);
请注意,它仅适用于焦点窗口。但无论菜单栏是否可见,都应该工作。