我一直在努力学习如何在Java中使用Key Binding。这是我到目前为止,但它似乎没有工作。当我按'w'时,它应该打印“你好!”。但按'w'什么都不做。
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
public class Space extends JPanel {
public static void createAndShowUI() {
JFrame frame = new JFrame("Space");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Space());
frame.pack();
frame.setVisible(true);
Action wKey = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println("Hello");
};
};
InputMap im = frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = frame.getRootPane().getActionMap();
im.put(KeyStroke.getKeyStroke("w"),"doSomething");
am.put("doSomething", wKey);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}}
提前致谢!
答案 0 :(得分:3)
1)您正在更改错误的InputMap:
//InputMap im = frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
InputMap im = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
2)您正在错误地创建KeyStroke。该字符串应包含使用KeyEvent_VK时找到的值?
因此,在您的情况下,您可以使用" W",这将映射到KeyEvent.VK_W。这将映射到keyPressed for" w"。
您还可以对keyTyped事件进行绑定:
im.put(KeyStroke.getKeyStroke('w'),"doSomething"); // or
im.put(KeyStroke.getKeyStroke("typed w"),"doSomething");