Java继承中重写KlickEvent方法报错的解决咨询
解决Java继承中重写方法的报错问题
咱们直接说你遇到的两个核心问题,一步一步解决:
1. @Override注解报错的根本原因
父类Handlerclass里的KlickEvent方法是带两个int参数的:
public void KlickEvent(int x, int y)
但你在子类GUI里写的是无参的KlickEvent方法:
@Override public void KlickEvent() { ... }
这不是重写(Override),而是重载(Overload)——相当于你定义了一个全新的方法,只是名字和父类的一样,但方法签名(参数类型、数量)完全不同。@Override注解的作用是告诉编译器“我要覆盖父类的某个方法”,但编译器找不到父类里有对应的无参KlickEvent,所以就抛出了那个错误提示。
解决方法很直接:让子类的KlickEvent方法签名和父类完全一致,保留@Override注解就行:
@Override public void KlickEvent(int x, int y) { System.out.println("test"); }
2. 监听器注册的逻辑错误
你在GUI的构造方法里新建了一个Handlerclass实例并注册给Frame:
Handlerclass handler = new Handlerclass(); Frame.addMouseListener(handler); Frame.addMouseMotionListener(handler);
但GUI本身就是Handlerclass的子类,你应该注册**当前GUI实例(this)**作为监听器。否则,Frame触发鼠标事件时,会调用那个新创建的父类实例的方法,根本不会触发你子类重写后的KlickEvent。
修正后的注册代码:
Frame.addMouseListener(this); Frame.addMouseMotionListener(this);
修正后的完整GUI子类代码
import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; public class GUI extends Handlerclass { JFrame Frame; int Sizex, Sizey; public GUI() { this(800,600,"Unbenannt"); } public GUI(int x, int y, String Fensternahme) { Sizex = x; Sizey = y; Frame = new JFrame(Fensternahme); Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Frame.setSize(Sizex,Sizey); // 注册当前GUI实例作为监听器 Frame.addMouseListener(this); Frame.addMouseMotionListener(this); Frame.setVisible(true); } // 正确重写父类的KlickEvent方法 @Override public void KlickEvent(int x, int y) { System.out.println("test"); } }
这样修改后,点击Frame窗口时,就会输出test而不是父类默认的klick了。
内容的提问来源于stack exchange,提问作者Jakob Kraus
相关产品推荐
相关产品推荐

