Java 如何使用KeyListener移动矩形
我试图在按下按键的同时移动一个矩形,并在释放时停止它,就像游戏“蛇”一样。作为参考,我遵循了教程 我试图调整代码中的一些内容:Java 如何使用KeyListener移动矩形,java,Java,我试图在按下按键的同时移动一个矩形,并在释放时停止它,就像游戏“蛇”一样。作为参考,我遵循了教程 我试图调整代码中的一些内容: import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import java.awt.Graphics; import java.awt.Color; import java.awt.event.ActionListener; import ja
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class f3 extends JPanel implements ActionListener, KeyListener {
static JFrame frame;
static Timer t;
static int x, y, velx, vely, c;
f3(){
t = new Timer(5, this);
x = 0;
y = 0;
velx = 0;
vely = 0;
frame = new JFrame();
frame.addKeyListener(this);
frame.setFocusable(true);
frame.setFocusTraversalKeysEnabled(false);
frame.setSize(500,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(x, y, 50, 30);
t.start();
}
public void actionPerformed(ActionEvent e) {
x = x + velx;
y = y + vely;
repaint();
}
public void keyPressed(KeyEvent e) {
c = e.getKeyCode();
if(c == KeyEvent.VK_RIGHT) {
velx = 1;
vely = 0;
}
if(c == KeyEvent.VK_LEFT) {
velx = -1;
vely = 0;
}
if(c == KeyEvent.VK_UP) {
velx = 0;
vely = -1;
}
if(c == KeyEvent.VK_DOWN) {
velx = 0;
vely = 1;
}
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public static void main(String args[]) {
new f3();
}
}
由于
velx
和vely
指示移动的速度(例如,与一次将玩家移动一个空间相反),您还需要确保在释放与该轴关联的特定键时,keyReleased
将适当的速度返回到0。您没有keyReleased方法的处理程序,在该方法中,您应该将速度设置为零:
public void keyReleased(KeyEvent e) {
velx = 0;
vely = 0;
}
触发按键事件后,设置
velx
和vely
的值。由于您在此处使用的是计时器
,GUI将不断更新,因为actionPerformed
会反复触发
卸下计时器
,然后将按键的更改部分置于此窗体中,您将获得所需的结果
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
velx = 1;
vely = 0;
x = x + velx;
y = y + vely;
repaint();
}
}