Моя программа имеет JMenuBar
с JMenuItem
s. У них есть ActionListener
, и я установил ярлык с setAccelerator
. Теперь я скрываю панель меню, когда окно становится нефокусированным, чтобы получить больше места для отображаемого изображения. Но после первого скрытия строки меню горячие клавиши просто перестают работать.невидимый JMenuBar, ускоритель не работает
Как это исправить?
Я создал небольшой пример код, чтобы проиллюстрировать, что странное поведение:
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
}
});
}
}
Для справки: Я использую Java 1.7.0_60-ЭО (Java 7) на Mac. Но эта ошибка возникает независимо от используемой собственной строки меню Mac или обычной строки меню java внутри JFrame.