你確實已經給出了答案,但你有什麼是不是一個無限循環,但無限遞歸,這最終會導致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)看起來這個問題很容易被複制到一個較小的示例程序中。 –