Java AWT实现点击显示Shape功能报AWT-EventQueue-0 NoSuchMethodError求助
问题原因与修复方案
报错NoSuchMethodError的根因
该错误与AWT事件调度线程无关,是编译生成的类版本和运行时加载的类版本不匹配导致的:你之前编写DessinComponent类时未定义接收Shape、Color、int、int四个参数的构造方法,已经编译生成过旧的.class文件;后续你新增了对应构造方法后没有全量重新编译所有类,运行时JVM加载的仍是没有该构造方法的旧类文件,因此抛出方法不存在的错误。
解决方式:
- 清空项目目录下所有已生成的
.class后缀文件 - 完整重新编译项目所有Java代码即可解决该报错
代码逻辑问题修复(解决报错后图形不显示的问题)
解决编译版本问题后,你还会遇到点击鼠标无矩形显示的问题,需要调整三处逻辑:
- 你使用了
null绝对布局,所有手动添加的组件必须显式设置宽高,否则组件默认宽高为0无法渲染,放开DessinComponent构造方法中设置大小的注释即可。 - 点击鼠标新增组件后,需要手动触发容器的布局刷新和重绘,否则新增组件不会被渲染,在
mouseClicked方法的add(composant);后新增两行代码:
revalidate(); repaint();
- 如果你需要矩形跟随点击位置显示,需要将矩形的相对坐标改为(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
相关产品推荐
相关产品推荐

