ActionListener in Actionlistener

R0wiwan

Mitglied
Hallo, ich versuche, einen 2. ActionListener am Ende des 1. ActionListener aus einer anderen Klasse einzufügen, damit ich neue Buttons und Befehle machen kann.
Leider funktioniert das nicht ganz.

Hier ist Klasse 1:​


Java:
package Test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextArea;

import Kapitel.Kapitel1_1;


public class Controller implements ActionListener {
   
    public StoryWindow window;

    public void startStory() {
        window = new StoryWindow(this);
        window.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
       
        if (command.equals("Start")) {
           
            JLabel titleNeu = StoryWindow.title;
            titleNeu.setText("Neuer Titel");
           
            JTextArea textNeu = StoryWindow.text;
            textNeu.setText("Neuer Text");
           
            JLabel ausgabeNeu = StoryWindow.ausgabe;
            ausgabeNeu.setText("Neuer Text");
           
            JButton buttonANeu = StoryWindow.auswahlA;
            buttonANeu.setText("Auswahl A");
           
            JButton buttonBNeu = StoryWindow.auswahlB;
            buttonBNeu.setText("Auswahl B");
           
            Kapitel1_1.actionPerformed2(e2);           <----------- Hier ist der Fehler bei mir
           
        }
        else if (command.equals("Exit")) {
            System.exit(0);
        }
       
    }
   
}


Klasse 2:​


Java:
package Kapitel;

import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextArea;

import Test.Controller;
import Test.StoryWindow;

public class Kapitel1_1 {
   
    public static void actionPerformed2(ActionEvent e2) {
        String command = e2.getActionCommand();
       
        if (command.equals("Auswahl A")) {
           
            JLabel titleNeu = StoryWindow.title;
            titleNeu.setText("Neuer Titel");
           
            JTextArea textNeu = StoryWindow.text;
            textNeu.setText("Neuer Text");
           
            JLabel ausgabeNeu = StoryWindow.ausgabe;
            ausgabeNeu.setText("Neuer Text");
           
            JButton buttonANeu = StoryWindow.auswahlA;
            buttonANeu.setText("Auswahl A");
           
            JButton buttonBNeu = StoryWindow.auswahlB;
            buttonBNeu.setText("Auswahl B");
        }
   
    }
   
}


Könnt ihr mir helfen?
 
Zuletzt bearbeitet von einem Moderator:
Als erstes paar Hinweise, damit wir Dir helfen können:
a) Code in Code Tags posten (Also über dem Eingabebereich den Knopf </> drücken!)
b) Du bekommst einen Fehler -> Dann gib doch bitte die Details. Lieber mehr als zu wenig posten ... wenn etwas sehr lang ist, dann kannst Du die "Spoiler" Funktionalität nutzen (Hinter den drei Punkten neben der Tabelle versteckt).

Und das sieht vom Aufbau schon extrem dubios aus. Vergiss static - Außer bei der public static void Methode und ggf. bei Konstanten (public static final ....) solltest Du es nicht nutzen.

Und auf den ersten Blick nutzt Du da ein e2, aber du hast kein e2. Willst Du das das ActionEvent, das Du bereits bekommen hast, weiter geben? Dann nutz dies auch (das ist bei Dir e wenn ich das jetzt richtig gesehen habe). Du willst ein anderes ActionEvent haben? Dann erstelle es ...
 
Als erstes paar Hinweise, damit wir Dir helfen können:
a) Code in Code Tags posten (Also über dem Eingabebereich den Knopf </> drücken!)
b) Du bekommst einen Fehler -> Dann gib doch bitte die Details. Lieber mehr als zu wenig posten ... wenn etwas sehr lang ist, dann kannst Du die "Spoiler" Funktionalität nutzen (Hinter den drei Punkten neben der Tabelle versteckt).

Und das sieht vom Aufbau schon extrem dubios aus. Vergiss static - Außer bei der public static void Methode und ggf. bei Konstanten (public static final ....) solltest Du es nicht nutzen.

Und auf den ersten Blick nutzt Du da ein e2, aber du hast kein e2. Willst Du das das ActionEvent, das Du bereits bekommen hast, weiter geben? Dann nutz dies auch (das ist bei Dir e wenn ich das jetzt richtig gesehen habe). Du willst ein anderes ActionEvent haben? Dann erstelle es ...

Okay, in Zukunft werde ich an die Code Tags denken.
Der Fehler bei der Markierung lautet "e2 cannot be resolved to a variable".
Und e2 habe ich ja eigentlich erstellt, in der 2. Klasse. Das andere ActionEvent ebenfalls.
 
Das e2 ist in der anderen Klasse der Name des Parameters.

Also ich habe eine Methode, die heißt gibTeddybär und diese nimmt einen Teddybär entgegen. Wenn ich den entgegen nehme, dann nenne ich den entgegengenommenen Bären einfach "Teddy". So habe ich eine Möglichkeit, diesen zu benennen.

Aber nur weil ich einen Teddybären im Falle der Übergabe "Teddy" nenne, existiert nicht plötzlich irgendwo ein Teddy. Und wenn Du mir einen TeddyBär geben willst, dann musst Du erst irgendwoher einen bekommen!

So ist es auch bei den Action Listener: Der erwartet ein ActionEvent (= TeddyBär). Und nur weil der zweite Listener den "e2" ( = "Teddy") nennt, existiert der noch nicht woanders. Du musst also, wenn Du da ein ActionEvent übergeben musst, irgend wo ein solches Event her bekommen.
So ein ActionEvent hat der erste ActionListener ja bekommen - diesen könntest Du z.B. verwenden.
 
Nur ein paar Gedankengänge am Rande:

- Die Klasse heißt Controller, von daher gehe ich davon aus, dass es sich um ein MVC Pattern handelt. Dahingehend ist der Aufbau ohnehin fragwürdig. Ein Controller sollte keine GUI Elemente kennen. Einen guten Controller hat man meiner Meinung nach geschrieben, wenn man die Swing GUI ohne großen Aufwand in Controller (+Model) ersetzen könnte.
- Auch lässt die Implementierung von Controller und Kapitel1_1 vermuten, dass die Eigenschaften von StoryWindow statisch sind, was ich schrecklich finde.
- Außerdem verletzen diese das Geheimnisprinzip.
- packages sollten außerdem im lowercase benannt werden.

Was ich eigentlich sagen will - Ich sehe in dem Code keine Struktur und kein Ziel. Ich könnte nicht sagen worauf du hinaus willst und entsprechend auch keine echten Tipps geben außer dir meinen leider schlechten Eindruck zu vermitteln. Sicherlich auch nicht sehr konstruktiv. Das tut mir Leid. Für mich ist das nur ein Chaoscode.
 
Nur ein paar Gedankengänge am Rande:

- Die Klasse heißt Controller, von daher gehe ich davon aus, dass es sich um ein MVC Pattern handelt. Dahingehend ist der Aufbau ohnehin fragwürdig. Ein Controller sollte keine GUI Elemente kennen. Einen guten Controller hat man meiner Meinung nach geschrieben, wenn man die Swing GUI ohne großen Aufwand in Controller (+Model) ersetzen könnte.
- Auch lässt die Implementierung von Controller und Kapitel1_1 vermuten, dass die Eigenschaften von StoryWindow statisch sind, was ich schrecklich finde.
- Außerdem verletzen diese das Geheimnisprinzip.
- packages sollten außerdem im lowercase benannt werden.

Was ich eigentlich sagen will - Ich sehe in dem Code keine Struktur und kein Ziel. Ich könnte nicht sagen worauf du hinaus willst und entsprechend auch keine echten Tipps geben außer dir meinen leider schlechten Eindruck zu vermitteln. Sicherlich auch nicht sehr konstruktiv. Das tut mir Leid. Für mich ist das nur ein Chaoscode.

Das Ziel ist es, dass man auf den Knopf drückt, und dadurch sich die Textausgabe ändert.
Beim ersten ActionListener funktioniert das ja auch, aber ich bekomme es nicht hin, dass nach dem ersten der zweite ActionListener aufgerufen wird und auf die neuen Buttons hört.
 
Das e2 ist in der anderen Klasse der Name des Parameters.

Also ich habe eine Methode, die heißt gibTeddybär und diese nimmt einen Teddybär entgegen. Wenn ich den entgegen nehme, dann nenne ich den entgegengenommenen Bären einfach "Teddy". So habe ich eine Möglichkeit, diesen zu benennen.

Aber nur weil ich einen Teddybären im Falle der Übergabe "Teddy" nenne, existiert nicht plötzlich irgendwo ein Teddy. Und wenn Du mir einen TeddyBär geben willst, dann musst Du erst irgendwoher einen bekommen!

So ist es auch bei den Action Listener: Der erwartet ein ActionEvent (= TeddyBär). Und nur weil der zweite Listener den "e2" ( = "Teddy") nennt, existiert der noch nicht woanders. Du musst also, wenn Du da ein ActionEvent übergeben musst, irgend wo ein solches Event her bekommen.
So ein ActionEvent hat der erste ActionListener ja bekommen - diesen könntest Du z.B. verwenden.
Okay, das versuche ich mal.
 

Zurück
Oben