小程序中的KeyPress故障

时间:2013-12-15 22:44:05

标签: java applet awt keypress keylistener

下面是我一直在制作的applet,它允许用户使用箭头键在屏幕上移动一个矩形。除了向下键之外,所有键都起作用,这使得矩形在对角线中向右下移动。答案可能很明显;希望不是!请帮忙!谢谢!

import javax.swing.*;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
import java.util.ArrayList;

import javax.imageio.ImageIO;

public class Move extends Applet implements KeyListener {
    private Rectangle rect;
    private ArrayList<Integer> keysDown;

public void init() {
    this.addKeyListener(this);
    keysDown = new ArrayList<Integer>();
    rect = new Rectangle(0, 0, 50, 50);
}

public void paint(Graphics g) {
    setSize(600, 400);
    Graphics2D g2 = (Graphics2D)g;
    g2.fill(rect);
}

@Override
public void keyPressed(KeyEvent e) {
    if (!keysDown.contains(e.getKeyCode()))
        keysDown.add(new Integer(e.getKeyCode()));
moveRect();
}

@Override
public void keyReleased(KeyEvent e) {
    keysDown.remove(new Integer(e.getKeyCode()));
}

public void moveRect() {
    int x = rect.x;
    int y = rect.y;
    if (keysDown.contains(KeyEvent.VK_UP)) {
        y -= 2;
    }
    if (keysDown.contains(KeyEvent.VK_DOWN)) {
        y += 2;
    }
    if (keysDown.contains(KeyEvent.VK_LEFT)) {
        x -= 2;
    }
    if (keysDown.contains(KeyEvent.VK_DOWN)) {
        x += 2;
    }
    rect.setLocation(x, y);
    repaint();
}

@Override
public void keyTyped(KeyEvent e) {

}
}

1 个答案:

答案 0 :(得分:2)

您在处理按键的VK_RIGHT中的if语句中是否遗漏了moveRect

我看到你有两个VK_DOWN - 当你按下向下键时,这将沿着X和Y移动矩形。

moveRect方法中查看这些行并注意VK_DOWN如何处理两次,(并且根本不处理VK_RIGHT):

if (keysDown.contains(KeyEvent.VK_UP)) {
    y -= 2;
}
if (keysDown.contains(KeyEvent.VK_DOWN)) {
    y += 2;
}
if (keysDown.contains(KeyEvent.VK_LEFT)) {
    x -= 2;
}
if (keysDown.contains(KeyEvent.VK_DOWN)) {
    x += 2;
}