Java In JFrame auf Event von Button in anderer Klasse reagieren

I-Bot18

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
291
Hi,

ich bin gerade dabei ein Pong-Spiel zu programmieren.
Jetzt steh ich vor einem Problem:

Ich habe ein MainFrame.
Dieses enthält ein ContainerPanel mit CardLayout. In diesem wird zu Beginn ein StartPanel dargestellt, dass in einer anderen Klasse erzeugt wird.
Dieses Panel enthält Textfelder für Spielernamen und einen Button der letzen Endes dazuführen soll, dass das StartPanel verschwindet und das eigentliche GamePanel gezeigt wird.

Um im CardLayout unterscheiden zu können welches Panel gerade aktiv sein soll, habe ich einen String erzeugt, der "Start" oder "Active" ist und dementsprechend das Panel zeigt.

Nun soll wenn der Start-Button im StartPanel geklickt wird, sich der String ändern und anschließend das GamePanel im ContainerPanel dargestellt werden.

Ich bekomme aber nicht hin/bzw. hab keine Ahnung ob dies möglich ist, das MainFrame auf das Event der StartPanel-Klasse hören zu lassen, um den String zu ändern.
Das StartPanel sollte auch nichts vom MainFrame wissen, folglich kann ich da ja auch nicht mit setters ran...

Vielleicht hat ja einer von euch ne Idee ?

Vielen Dank schon mal :)
Falls Code benötigt werden einfach sagen ;)

Gruß, Tobi
 
I-Bot18 schrieb:
Hi,
Dieses enthält ein ContainerPanel mit CardLayout. In diesem wird zu Beginn ein StartPanel dargestellt, dass in einer anderen Klasse erzeugt wird.
Dieses Panel enthält Textfelder für Spielernamen und einen Button der letzen Endes dazuführen soll, dass das StartPanel verschwindet und das eigentliche GamePanel gezeigt wird.

Um im CardLayout unterscheiden zu können welches Panel gerade aktiv sein soll, habe ich einen String erzeugt, der "Start" oder "Active" ist und dementsprechend das Panel zeigt.

Nun soll wenn der Start-Button im StartPanel geklickt wird, sich der String ändern und anschließend das GamePanel im ContainerPanel dargestellt werden.

Ich bekomme aber nicht hin/bzw. hab keine Ahnung ob dies möglich ist, das MainFrame auf das Event der StartPanel-Klasse hören zu lassen, um den String zu ändern.
Das StartPanel sollte auch nichts vom MainFrame wissen, folglich kann ich da ja auch nicht mit setters ran...
Vielleicht hat ja einer von euch ne Idee ?
Erst mal Entschuldigung für den langen Post, ich weiß nicht wie gut deine Programmierkenntnisse sind.

Da ich deine Klassenstruktur nicht genau kenne und nicht weiß wo was initialisiert wird kann ich dir natürlich keine präzise Lösung für dein Problem geben.
Solange es sich hier um ein JFrame handelt sollte dieses Problem einfach zu lösen sein solange du keinen chaos Code und auch nicht chaos mäßig initialisierst hast.

Wenn du sauber gekapselt hast, gibt es einige Ansätze.
Dieses Problem gibt es beim Programmieren sehr häufig

Um dir den Lösungsanstz zu veranschaulichen ein Beispiel:
Auto, Motor, Öltank, Amatur und Warnleuchte stellt man sich einfach als Objekte vor.

Auto enthält Motor
Motor enthält Öltank
Auto enthält Amatur
Amatur enthält Warnleuchte

Nehmen wir nun mal rein theoretisch an, dass das Öl während einer Fahrt knapp wird.
In diesem Fall weiß dies natürlich zuerst der Öltank, damit nun aber die Warnleuchte angeht müssten wir dies irgendwie der Warnleuchte "sagen".
Im echten Auto wäre dies vermutlich einfach über eine direkte Leitung gelöst.
Streng objekt orientiert gibt es hier beim Programmieren ein paar saubere und auch unsaubere Lösungsansätze ich benutze eigentlich immer wenn möglich Observer-Pattern ist vielleicht aber auch bei dir (und deinem eventuellen Wissensstand) "Overkill".

1. (Unsauber) Auto ist in dem Fall die "Ich-kenne-alles-und-muss-auch-alles-können" Klasse. Auto könnte ja per Getter und Setter Methoden (wenn vorhanden) an alle enthaltenen Objekte (und deren Objekte) ran kommen.
Von daher könnte man Auto nun eine "aktiviere-Warnlampe"-Methode geben und die Referenz auf Auto bis nach unten via Konstruktor an Öltank weiterreichen und dann falls das Ereignis eintritt, kann Öltank diese Methode direkt aufrufen.
- In deinem Fall nimmst du einfach die Klasse die beide Objekte kennt.

2. (Nicht ganz sauber aber definitiv besser als 1.) Du könntest die Leuchte (über eine lange Kette) theoretisch dem Kontruktor von Öltank übergeben und dieser wird dann immer direkt benachrichtigt.

3. (Sauber) Es darf eigentlich speziell keine "Ich-kann-alles-Klasse" geben es wäre einfach eine sinnvolle Reihnfolge die zu Initialierung wählen. Wenn ich schon zu Beginn wüsste dass Amatur stark von vielen Komponenten im Motor abhängig ist dies aber andersherum nicht der Fall ist. Dann würde ich den initialisierten Motor an Amatur übergeben und Amatur kümmert und verteilt die enthaltenen Objekte weiter.
Nun könnte sich Leuchte könnte dann als Listener (Siehe Observer Pattern + Java) bei Öltank eintragen und kann dann direkt Antwort erhalten.

Bei Fragen bitte die Klassenstruktur mit angeben.
 
Zurück
Oben