你确实已经给出了答案,但你有什么是不是一个无限循环,但无限递归,这最终会导致StackOverflowError。
这里发生了什么:
new GUI()
调用new nupuVajutus()
。这通过调用它的构造函数创建一个新的nupuVajutus
对象。因为nupuVajutus
延伸了GUI
,这意味着nupuVajutus
对象是具有附加功能的GUI
对象。因此,因为它是一个GUI
对象,所以需要调用一个GUI
构造函数。 nupuVajutus
构造函数没有显式调用super
构造函数,所以它在执行之前隐式调用GUI()
(无参数)构造函数。在这个新的调用GUI()
构造,另一个new nupuVajutus()
调用中遇到,等等,循环往复 ...
在我看来,你需要做的周围面向对象编程的一些更多的研究,特别是主题子类,继承,对象实例和封装。有plenty of resources available to help you。
在将ActionListener抽取到单独的文件中后,您不应该将其更改为扩展GUI。这扩展了类(这就像一个蓝图),而不是实例(这就像使用蓝图构建的东西) - 记住:您可以创建一个类的多个实例。
此前,“nupuVajutus”ActionListener是一个内部类,所以它可以访问所有封闭类的字段和方法。现在它不再是一个内部类,它需要传递一个对GUI实例的引用,以便它可以访问它的方法。事情是这样的:
public class NupuVajutus implements ActionListener {
private final GUI gui;
public NupuVajutus(GUI gui) {
this.gui = gui;
}
public void actionPerformed(ActionEvent e) {
// The GUI instance can now be accessed through the gui field, for example:
gui.something();
// ...
}
}
而在GUI()
构造:
NupuVajutus nV = new NupuVajutus(this);
说实话,虽然,有什么不对保持你的ActionListener作为一个内部类。如果你永远不会在GUI类之外使用这个类,那么它可能更适合作为内部类。
尝试发布[SSCCE](http://sscce.org)看起来这个问题很容易被复制到一个较小的示例程序中。 –