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

Java AWT实现点击显示Shape功能报AWT-EventQueue-0 NoSuchMethodError求助

问题原因与修复方案

报错NoSuchMethodError的根因

该错误与AWT事件调度线程无关,是编译生成的类版本和运行时加载的类版本不匹配导致的:你之前编写DessinComponent类时未定义接收Shape、Color、int、int四个参数的构造方法,已经编译生成过旧的.class文件;后续你新增了对应构造方法后没有全量重新编译所有类,运行时JVM加载的仍是没有该构造方法的旧类文件,因此抛出方法不存在的错误。
解决方式:

  • 清空项目目录下所有已生成的.class后缀文件
  • 完整重新编译项目所有Java代码即可解决该报错

代码逻辑问题修复(解决报错后图形不显示的问题)

解决编译版本问题后,你还会遇到点击鼠标无矩形显示的问题,需要调整三处逻辑:

  1. 你使用了null绝对布局,所有手动添加的组件必须显式设置宽高,否则组件默认宽高为0无法渲染,放开DessinComponent构造方法中设置大小的注释即可。
  2. 点击鼠标新增组件后,需要手动触发容器的布局刷新和重绘,否则新增组件不会被渲染,在mouseClicked方法的add(composant);后新增两行代码:
revalidate();
repaint();
  1. 如果你需要矩形跟随点击位置显示,需要将矩形的相对坐标改为(0,0),同时给DessinComponent设置点击坐标的位置,避免矩形永远固定在(160,220)位置。

调整后的完整可运行代码

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class TestGraphic2 {
    public static void main(String... args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Frame frame = new Frame();
                frame.setSize(600, 400);
                frame.setLocationRelativeTo(null);
                frame.add(new Contenaire());
                frame.setVisible(true);
                frame.addWindowListener(new WindowAdapter(){
                    @Override
                    public void windowClosing(WindowEvent e) {
                        frame.dispose();
                    }
                });
            }
        });
    }
}

class Contenaire extends Container {
    private Shape shape;
    public Contenaire() {
        super();
        setLayout(null);
        setLocation(0, 0);
        setSize(Short.MAX_VALUE, Short.MAX_VALUE);
        // 矩形相对组件的坐标改为0,0
        shape = new Rectangle2D.Double(0, 0, 100, 40);
        addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                DessinComponent composant = new DessinComponent(shape,Color.green,x,y);
                add(composant);
                // 新增刷新和重绘代码
                revalidate();
                repaint();
            }
        });
    }
}

class DessinComponent extends Component {
    private Shape shape;
    private Color color;

    public DessinComponent(Shape shape, Color color, int x, int y) {
        this.shape = shape;
        this.color = color;
        // 设置组件位置为点击坐标
        setLocation(x, y);
        // 放开大小设置
        setSize(Short.MAX_VALUE, Short.MAX_VALUE);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(color);
        g2.draw(shape);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:24:05