如何使用KeyListener

我正在尝试在我的程序中实现一个keylistener,以便当我按下箭头键时它会执行一个动作,我的程序中的对象向左或向右移动。

这是我程序中的移动方法

public void moveDirection(KeyEvent e) { int move = 0; int r = K.getRow(); int c = K.getCol(); if (e.getKeyCode() == 39) move = 1; //KeyEvent.VK_RIGHT if (e.getKeyCode() == 37) move = 2; //KeyEvent.VK_LEFT //if (e.getKeyCode() == KeyEvent.VK_DOWN) move = 3; switch (move) { case 1: if (inBound(r, c+1)) K.setLocation(r ,c+1); if (inBound(r, c-1) && frame2[r][c-1] == K) frame2[K.getRow()][K.getCol()-1] = null; break; //move right 39 case 2: K.setLocation(K.getRow(), K.getCol()-1); break; //move left 37 //case 3: b.setLocation(b.getRow()+1, b.getCol()); break; //move down default: return; } processBlockList(); } 

我想知道程序应该如何读入(KeyEvent)e。 我真的不能输入一个箭头键….

请帮忙!

编辑:我还需要知道我需要添加到我的代码中,以便我的程序等待大约700毫秒的密钥输入,然后再转到另一个方法

http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html查看本教程

如果它是一个基于UI的应用程序,那么“我还需要知道我需要添加到我的代码中,以便我的程序在转到另一个方法之前等待大约700毫秒的密钥输入”你可以使用GlassPane或Timer类来实现需求。

对于关键事件:

 public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = -1; } if (key == KeyEvent.VK_RIGHT) { dx = 1; } if (key == KeyEvent.VK_UP) { dy = -1; } if (key == KeyEvent.VK_DOWN) { dy = 1; } } 

查看此游戏示例http://zetcode.com/tutorials/javagamestutorial/movingsprites/

这是一个SSCCE ,

 package experiment; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class KeyListenerTester extends JFrame implements KeyListener { JLabel label; public KeyListenerTester(String s) { super(s); JPanel p = new JPanel(); label = new JLabel("Key Listener!"); p.add(label); add(p); addKeyListener(this); setSize(200, 100); setVisible(true); } @Override public void keyTyped(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { System.out.println("Right key typed"); } if (e.getKeyCode() == KeyEvent.VK_LEFT) { System.out.println("Left key typed"); } } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { System.out.println("Right key pressed"); } if (e.getKeyCode() == KeyEvent.VK_LEFT) { System.out.println("Left key pressed"); } } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { System.out.println("Right key Released"); } if (e.getKeyCode() == KeyEvent.VK_LEFT) { System.out.println("Left key Released"); } } public static void main(String[] args) { new KeyListenerTester("Key Listener Tester"); } } 

另外阅读以下链接: 如何编写密钥监听器以及如何使用密钥绑定

实现KeyListener接口的类成为我们的自定义键事件侦听器。 这个监听器不能直接监听关键事件。 它只能通过JFrame等中间对象监听关键事件。 所以

  1. 将一个Key侦听器类设为

     class MyListener implements KeyListener{ // override all the methods of KeyListener interface. } 
  2. 现在我们的类MyKeyListener已准备好监听关键事件。 但它不能直接这样做。

  3. 创建任何对象,如JFrame对象, MyListener可以通过它来侦听键事件。 为此,您需要将MyListener对象添加到JFrame对象。

     JFrame f=new JFrame(); f.addKeyListener(new MyKeyListener); 

除了使用KeyListener(如其他人的答案所示),有时您必须确保您使用的JComponent是Focusable。 这可以通过将其添加到组件来设置(如果您是子类):

 @Override public void setFocusable(boolean b) { super.setFocusable(b); } 

并将此添加到您的构造函数:

 setFocusable(true); 

或者,如果从父类/容器调用该函数:

 JComponent childComponent = new JComponent(); childComponent.setFocusable(true); 

然后做其他人提到的所有KeyListener东西。