2014-08-29 2 views
1

Моя программа имеет 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.

ответ

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); 

Обратите внимание, что он работает только в сфокусированного окне. Но он должен работать независимо от того, что панель меню видна или нет.

Смежные вопросы