Methoden mit Methoden aufrufen - Programm hängt sich auf

Fishmeaker

Mitglied
Ich habe vor einiger Zeit zur Übung für OOP ein "kleines" Rollenspiel geschrieben.

Dieses lief über angepasste Dialogfelder mit verschiedenen Buttons. In der Main waren dazu alle Menüstrukturen und Hauptfunktionen durch Schleifen und Bedingungen miteinader verbunden.
In eigene Klassen habe ich Gegenstände von verschiedenen Typen, Spielerklassen und die Mob's gepackt.

Das Spiel lief soweit einwandfrei Fehler habe ich über die Zeit hinweg durch Exceptions ausgeschlossen.

Nun habe ich mich etwas mit GUI's befasst und wollte mein Spiel in ein GUI Fenster einbetten, welches sich durch die Hauptfunktionen des Spiels anpasst.
Dazu wollte ich die einzelnen Schritte der Main wie Shop, Charakterinformationen oder Dungeonauswahl in eigene Methoden der Main packen. In jeder Methode will ich nun die ActionListener der 4 Butttons meiner GUI neu beschreiben und sie die nächte Methode ausführen lassen.

Leider hängt sich mein Programm sofort komplett auf, nachdem ich den Button Dungeon im Hauptmenü gedrückt habe.

Ich habe keine Ahnung wieso das passiert und hoffe mir kann hier jemand mit mehr Erfahrung und Wissen meinen Fehler aufzeigen und mir zur Lösung verhelfen kann.

Vielen Dank dafür im Vorraus

mfg Fishmeaker

edit: Wenn mir jemand noch dazu sagen könnte wie ich meinen Code als Code deklariere wäre ich auch sehr dankbar ^^'

Methode Hauptmenue() :

Code (Java):
Java:
//Hauptmenü
public static void Hauptmenue() {
   Fenster.setzeDialog("Hauptmenü");
   Fenster.setzeEnergie(player.energie);
   Fenster.setzeGesundheit(player.health);
   Fenster.setzeMobGesundheit(0);
   Fenster.setzeKnoepfe("Dungeon", "Charakter", "Shop", "Beenden");
   Fenster.setzeName(player.name);
   Fenster.setzeMob("");
   Fenster.setzeKnopfeAktiv(true, true, true, true);
   Fenster.knopf1.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       Ebenenauswahl();
     }
   });
   Fenster.knopf2.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       Charakter();
     }
   });
   Fenster.knopf3.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       Shop();
     }
   });
   Fenster.knopf4.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       Beenden();
     }
   });
}

Methode Ebenenauswahl():

Code (Java):
Java:
//Dungeon

//Ebenenauswahl

public static void Ebenenauswahl() {
   Fenster.setzeDialog("Dungeonschwierigkeit");
   Fenster.setzeKnoepfe("Leicht", "Mittel", "Schwer", "Endgame");
   Fenster.setzeKnopfeAktiv(true, true, false, false); //Später alles true
   mobnumber = 1;
   herzenLoot = 0;
   Fenster.knopf1.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       //Leicht
       mobnumber = Zufall(1, 20); //Später 1-20
       herzenLoot = 1; //loot herzen des mobs
       mob = Monsterzuweisung(mobnumber);
       //Weiter mit nächster Methode
     }
   });
   Fenster.knopf2.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       //Mittel
       mobnumber = Zufall(21, 40); //später 21-40
       herzenLoot = 5; //loot herzen des mobs - später 5
       mob = Monsterzuweisung(mobnumber);
       //Weiter mit nächster Methode
     }
   });
   Fenster.knopf3.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       //Schwer
       mobnumber = Zufall(21, 40); //später 41-60
       herzenLoot = 5; //loot herzen des mobs - später ca15
       mob = Monsterzuweisung(mobnumber);
       //Weiter mit nächster Methode

     }
   });
   Fenster.knopf4.addActionListener(
   new ActionListener() {
     public void actionPerformed(ActionEvent event) {
       //Endgame
       mobnumber = Zufall(21, 40); //später 61+
       herzenLoot = 5; //loot herzen des mobs später ca15
       mob = Monsterzuweisung(mobnumber);
       //Weiter mit nächster Methode
     }
   });
}
 
Zuletzt bearbeitet von einem Moderator:
Moin,

>> Wenn mir jemand noch dazu sagen könnte wie ich meinen Code als Code deklariere ...
Klick mal im Editor auf den vierten Button von rechts (mit ToolTip "Einfügen...") !!

Poste mal den StackTrace, der kommen wird, da mit einiger Sicherheit eine unbehandelte Exception auftritt !
Gruß Klaus
 
Poste mal den StackTrace, der kommen wird, da mit einiger Sicherheit eine unbehandelte Exception auftritt !
Gruß Klaus

Vielen Dank erstmal für die Antwort. Was genau soll ich posten?
Ich weis nicht genau was StackTrace ist. Ich denke mal das ist der Fehler, der mir auf Konsole zurückgegeben wird.

Nur leider bekomme ich keinerlei Infos zum Fehler.
Sobald ich "Dungeon" drücke bleibt der "Dungeon"-Button eingedrückt und das ganze Programm ist eingefroren.
 
Zuletzt bearbeitet:
Erstmal ist es sehr unschön die Buttons für andere Zwecke wiederzuverwenden (sehr unsauberes Design).
Insbesondere scheinst du immer nur neue ActionListener hinzuzufügen, ohne dabei die alten zu löschen.

Nun zu deinem Problem, scheinbar produzierst du irgendwo eine Endlosschleife.
Platziere doch mal ein paar Brakepoints und debugge dann Schritt für Schritt.
 
Insbesondere scheinst du immer nur neue ActionListener hinzuzufügen, ohne dabei die alten zu löschen

Ich weis, dass der Fehler genau in dem Teil liegen muss, den ich gepostet habe. Also beim ActionListener der Buttons.
Wenn ich immer neue ActionListener hinzufüge und die alten nicht lösche wie lösche ich diese dann?
Ich dachte, ich überschreibe den alten.
 
Ich weis, dass der Fehler genau in dem Teil liegen muss, den ich gepostet habe. Also beim ActionListener der Buttons.
In dem Teil den du gepostet hast, liegt der Fehler eben nicht. Den Kram kann man ausführen, ohne das es Probleme gibt.

Wenn ich immer neue ActionListener hinzufüge und die alten nicht lösche wie lösche ich diese dann?
Ich dachte, ich überschreibe den alten.
Die Methode heißt ja "add...", es wird also nur ein Listener hinzugefügt. Wenn es immer nur ein Listener geben würde, welcher ersetzt werden würde, so würde die Methode "set..." heißen.
Einen Listener kannst du mit removeActionListener entfernen, allerdings musst du eben den Listener, welcher entfernt werden soll als Parameter mitgeben. Entweder also den ActionListener zwischenspeichern oder mit getActionListeners alle Listener holen und einfach alle entfernen (sollte ja im Grunde immer nur einer sein, da du erst danach einen neuen hinzufügst).

Aber ich würde eher empfehlen das ganze nochmal neu programmieren und diesmal mehr auf die Sauberkeit des Codes zu achten.
 

Zurück
Oben