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

}