我的代码存在这个问题,我正在尝试学习如何在Java中使用击键,我希望能够跟踪我正在按哪些键击。我正在尝试使用KeyEvent.VK_UP跟踪我正在按的内容。
import java.awt.event.*;
import javax.swing.*;
public class TrackArrows
{
protected static InputMap inputMap;
public static void main(String[] arg){
JPanel panel = new JPanel();
inputMap = panel.getInputMap();
panel.getActionMap().put("keys", new AbstractAction() {
public void actionPerformed(ActionEvent e){
if(inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), true)){//My problem lies here
System.out.println("Key pressed up");
}
if(inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), true)){//And here
System.out.println("Key pressed down");
}
}
});
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "keys");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "keys");
JFrame frame = new JFrame();
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(20,20);
frame.setVisible(true);
}
}
这样做我错了,还是有其他方法可以做到这一点?
答案 0 :(得分:4)
Action无法访问KeyStroke。您需要为每个键绑定创建单独的Action。像这样:
class SimpleAction extends AbstractAction
{
public SimpleAction(String name)
{
putValue( Action.NAME, "Action " + name );
}
public void actionPerformed(ActionEvent e)
{
System.out.println( getValue( Action.NAME ) );
}
}
然后你创建像:
这样的动作Action up = new SimpleAction("Up");
但是你仍然会遇到问题,因为默认的InputMap只有在有焦点时才会收到关键事件,默认情况下,JPanel不可调焦。所以你有两个选择:
a)让小组专注:
panel.setFocusable( true );
b)使用不同的InputMap:
inputMap = panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Key Bindings文章尝试简化Swing tutortial中的一些键绑定概念。