问题是您查找的方式
KeyStroke。
KeyStroke.getKeyStroke('w')将返回typedw,由于某种原因,它不会触发键事件。这就是为什么我倾向于避免这种方法的原因。改为使用
panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward");要么
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward");
另外,您可能想为定义焦点约束
InputMap,例如
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)...
会更安全…但是您将需要确定要从哪个级别触发击键
有关更多详细信息,请参见
JComponent和如何使用键绑定。
更新了示例
import java.awt.BorderLayout;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import javax.swing.AbstractAction;import javax.swing.JComponent;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.KeyStroke;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;public class Test extends Jframe { private JPanel panel; public Test() { super(); setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); setSize(500, 500); setLayout(new BorderLayout()); setVisible(true); panel = new JPanel(); // HERE ARE THE KEY BINDINGS panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward"); panel.getActionMap().put("forward", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { System.out.println("test"); } }); // END OF KEY BINDINGS add(panel, BorderLayout.CENTER); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } new Test(); } }); }}


