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

Graphics2D绘制可键盘控制椭圆的Java代码报错求助

解决你的图形移动功能问题

我帮你排查出代码里的几个关键错误,一个个修复后就能实现你想要的方向键控制椭圆移动的功能了:

代码里的核心问题

  • 大小写错误:Java是严格区分大小写的,你把Graphics2D写成了全大写的GRAPHICS2D,编译器根本识别不了这个类
  • 缺失导入:使用Ellipse2D.Double需要导入java.awt.geom.Ellipse2D,否则会提示“找不到符号”
  • 语法错误:down()、left()、right()这几个方法的声明后面多了分号(比如public void down(); {),导致编译器认为这些方法没有方法体,直接报错
  • 方法名拼写错误:ActionListener接口要求实现的方法是actionPerformed,你写成了actionPeformed(少了一个'r'),这会导致接口方法未实现的编译错误
  • 类型不匹配:velx和vely定义的是int类型,但你赋值的是1.5这种浮点数值,会导致编译失败,需要把这两个变量改成double类型,同时x和y也建议改成double,保证移动的平滑性

修正后的完整代码

import java.awt.*;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D; // 新增Ellipse2D的导入
import javax.swing.JPanel;
import java.awt.event.*;
import javax.swing.Timer;

public class Screen extends JPanel implements ActionListener, KeyListener {
    Timer t = new Timer(5, this);
    // 把x、y、velx、vely改成double类型,支持浮点移动
    double x = 0, y = 0, velx = 0, vely = 0;

    public Screen() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        // 可选:设置面板背景色,方便看到椭圆
        setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 修正Graphics2D的大小写
        Graphics2D g2 = (Graphics2D) g;
        g2.fill(new Ellipse2D.Double(x, y, 40, 40));
    }

    // 修正方法名拼写:actionPeformed → actionPerformed
    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
        x += velx;
        y += vely;
    }

    public void up() {
        vely = -1.5;
        velx = 0;
    }

    // 去掉方法声明后的分号
    public void down() {
        vely = 1.5;
        velx = 0;
    }

    public void left() {
        vely = 0;
        velx = -1.5;
    }

    public void right() {
        vely = 0;
        velx = 1.5;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == KeyEvent.VK_UP) {
            up();
        }
        if (code == KeyEvent.VK_DOWN) {
            down();
        }
        if (code == KeyEvent.VK_LEFT) {
            left();
        }
        if (code == KeyEvent.VK_RIGHT) {
            right();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}

    // 可选:添加main方法,方便直接运行测试
    public static void main(String[] args) {
        JFrame frame = new JFrame("Move Ellipse");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Screen());
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

额外提示

  • 我添加了main方法,你可以直接运行这个类就能看到效果了
  • 给面板设置了白色背景,这样椭圆会更明显
  • 注意KeyListener依赖组件的焦点,如果你的面板上有其他组件,可能需要额外处理焦点问题,但当前代码里setFocusable(true)已经足够

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:12:48