Alternatively, if you are after a "global global application listener", you can use either KeyboardFocusManager.addKeyEventDispatcher or Toolkit.addAWTEventListener .
KeyboardFocusManager.addKeyEventDispatcher
public class GloablKeyListener { public static void main(String[] args) { new GloablKeyListener(); } public GloablKeyListener() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected class TestPane extends JPanel { private JLabel label; public TestPane() { setLayout(new BorderLayout()); label = new JLabel("Nothing happening here"); label.setHorizontalAlignment(JLabel.CENTER); add(label); KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE && e.isControlDown() && e.isAltDown()) { label.setText("Hit me"); } else { label.setText("Nothing to see here..."); } return false; } }); } } }
Toolkit.addAWTEventListener
public class GloablKeyListener { public static void main(String[] args) { new GloablKeyListener(); } public GloablKeyListener() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected class TestPane extends JPanel { private JLabel label; public TestPane() { setLayout(new BorderLayout()); label = new JLabel("Nothing happening here"); label.setHorizontalAlignment(JLabel.CENTER); add(label); Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { @Override public void eventDispatched(AWTEvent event) { if (event instanceof KeyEvent) { KeyEvent ke = (KeyEvent) event; if (ke.getID() == KeyEvent.KEY_TYPED) { if (ke.getKeyCode() == KeyEvent.VK_BACK_SPACE && ke.isControlDown() && ke.isAltDown()) { label.setText("Hit me"); } else { label.setText("Nothing to see here..."); } } } } }, AWTEvent.KEY_EVENT_MASK); } } }
Personally, I prefer KeyboardFocusManager.addKeyEventDispatcher . It is simpler and easier to use.
You can set up your own singlton manager, where you can assign KeyStroke to Action s, as well as key bindings.
source share