You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java游戏开发问题:按下方向键时矩形无法移动

解决方向键控制矩形移动的问题

嘿,我瞅见你在做Java小游戏时遇到了方向键没法移动矩形的问题,咱们一步步来搞定它!你的代码框架是对的,但缺了几个关键的实现部分,导致程序没法响应按键和更新位置。

问题出在哪?

  1. 没写完actionPerformed方法:你写的actionPe...应该是没完成Timer的回调方法,它负责定时更新矩形坐标并触发重绘,没它的话x、y值永远不会变,矩形当然不动。
  2. 没实现KeyListener的所有方法:你只加了addKeyListener(this),但没写处理按键事件的逻辑,程序根本接收不到你的方向键输入。

修正后的完整代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Gameseeting extends JPanel implements ActionListener, KeyListener {
    Timer tt = new Timer(5, this);
    int x = 2, y = 210, velx = 0, vely = 0;

    Gameseeting() {
        tt.start();
        setFocusable(true);
        addKeyListener(this);
        setFocusTraversalKeysEnabled(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(x, y, 40, 50);
    }

    // 补全Timer的回调方法,定时更新坐标并重绘
    @Override
    public void actionPerformed(ActionEvent e) {
        x += velx;
        y += vely;
        // 边界检测:防止矩形移出窗口
        x = Math.max(0, Math.min(x, getWidth() - 40));
        y = Math.max(0, Math.min(y, getHeight() - 50));
        repaint(); // 必须调用这个方法来重绘矩形
    }

    // 处理按键按下事件,设置移动速度
    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch (key) {
            case KeyEvent.VK_LEFT:
                velx = -2;
                vely = 0;
                break;
            case KeyEvent.VK_RIGHT:
                velx = 2;
                vely = 0;
                break;
            case KeyEvent.VK_UP:
                vely = -2;
                velx = 0;
                break;
            case KeyEvent.VK_DOWN:
                vely = 2;
                velx = 0;
                break;
        }
    }

    // 处理按键松开事件,停止移动
    @Override
    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT) {
            velx = 0;
        }
        if (key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN) {
            vely = 0;
        }
    }

    // KeyListener必须实现的方法,这里用不到但不能删
    @Override
    public void keyTyped(KeyEvent e) {}

    // 测试用的主方法,把JPanel加到窗口里
    public static void main(String[] args) {
        JFrame frame = new JFrame("Simple Game");
        Gameseeting gamePanel = new Gameseeting();
        frame.add(gamePanel);
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

额外注意点

  • 我加了main方法,直接运行就能看到效果,记得把这个类放在正确的包下或者直接运行。
  • 边界检测是可选的,但加上能避免矩形跑到窗口外面看不见。
  • 速度值(比如velx = -2)可以根据你的需求调整,数字越大移动越快。

内容的提问来源于stack exchange,提问作者Usman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:15:12