Java跟踪与输入地图的击键

问题描述:

我有我的代码这个问题,我想学习如何使用Java中的按键,并且我想能够跟踪哪些击键我按。我正在尝试使用KeyEvent.VK_UP来追踪我正在按下的内容。Java跟踪与输入地图的击键

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); 
    } 
}

我是这样做的错误,还是有另一种方法来做到这一点?

该操作无权访问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是不可聚焦。所以,你有两个选择:

一)使面板可聚焦:

panel.setFocusable(true); 

B)使用不同的InputMap:

inputMap = panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

Key Bindings本文试图简化一些的键绑定概念来自Swing tutortial。