You need to add the corresponding key to the InputMap component on which you want to apply KeyBinding , as shown below:
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( KeyStroke.getKeyStroke("pressed UP"), "pressedUPAction"); panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( KeyStroke.getKeyStroke("released UP"), "releasedUPAction"); panel.getActionMap().put("pressedUPAction", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { System.out.println("UP Arrow Pressed"); } }); panel.getActionMap().put("releasedUPAction", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { System.out.println("UP Arrow Released"); } });
Take a look at this working example:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SmallExample { private JButton button; private JPanel panel; private void displayGUI() { JFrame frame = new JFrame("Small Example"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); panel = new JPanel() { @Override public Dimension getPreferredSize() { return (new Dimension(100, 100)); } }; panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( KeyStroke.getKeyStroke("pressed UP"), "pressedUPAction"); panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( KeyStroke.getKeyStroke("released UP"), "releasedUPAction"); panel.getActionMap().put("pressedUPAction", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { System.out.println("UP Arrow Pressed"); } }); panel.getActionMap().put("releasedUPAction", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { System.out.println("UP Arrow Released"); } }); frame.setContentPane(panel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { new SmallExample().displayGUI(); } }; EventQueue.invokeLater(runnable); } }
source share