我目前正在尝试在我的程序中实现一个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毫秒的密钥输入
答案 0 :(得分:10)
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/
答案 1 :(得分:8)
这是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");
}
}
另请阅读以下链接:How to Write a Key Listener和How to Use Key Bindings
答案 2 :(得分:2)
实现KeyListener
接口的类成为我们的自定义键事件侦听器。这个监听器不能直接监听关键事件。它只能通过JFrame
等中间对象监听关键事件。所以
将一个Key侦听器类设为
class MyListener implements KeyListener{
// override all the methods of KeyListener interface.
}
现在我们的课程MyKeyListener
已准备好听取重要事件。但它不能直接这样做。
创建JFrame
对象之类的任何对象,MyListener
可以通过该对象监听关键事件。为此,您需要将MyListener
对象添加到JFrame
对象。
JFrame f=new JFrame();
f.addKeyListener(new MyKeyListener);
答案 3 :(得分:1)
除了使用KeyListener(如其他人的答案所示),有时您必须确保您使用的JComponent是Focusable。这可以通过将其添加到组件(如果您是子类)来设置:
@Override
public void setFocusable(boolean b) {
super.setFocusable(b);
}
并将其添加到构造函数中:
setFocusable(true);
或者,如果您从父类/容器调用该函数:
JComponent childComponent = new JComponent();
childComponent.setFocusable(true);
然后执行其他人提到的所有KeyListener内容。