Klasse über Button Event in anderer Klasse informieren

robC

Mitglied
Hallo!

Ich habe bereits einige Zeit in Google und Co investiert und habe nichts passendes gefunden. Deshalb habe ich mich entschlossen, mich hier anzumelden und meine Problematik direkt zu erläutern.

Für ein Schulprojekt programmiere ich in einer kleinen Gruppe ein Spiel. Das Spiel an sich läuft super, keine Probleme.
Dummerweise kommen die Probleme nun bei dem Bereich, der uns eigentlich viel trivialer vorkam, dem Programmieren eines Hauptmenüs.

Wir haben uns überlegt, das ganze in einem
Code:
JFrame
zu programmieren und in diesem
Code:
JFrame
zwischen verschiedenen
Code:
JPanel
zu wechseln, um das Projekt später vielleicht auch einfach in ein Applet packen zu können.
Das heißt, wir haben eine Klasse
Code:
SwitchPanel
und viele von
Code:
JPanel
abgeleitete Klassen, die wir je nach Bedarf zu unserem
Code:
JFrame
hinzufügen.
Zwei Klassen sind zum Beispiel
Code:
Hauptmenu
und
Code:
Spiel
.

Außerdem gibt es die Klasse
Code:
Spielfluss
, welche eigentlich den Wechsel zwischen den einzelnen Panels aufgrund von diversen Events (zum Beipiel einem Klick auf einen Button oder dem Ende des Spiels) ausführt.

Hier kommt das Problem:
Eine Instanz der Klasse
Code:
Spielfluss
instanziert die Klasse
Code:
Hauptmenu
, welche wie gesagt von
Code:
JPanel
abgeleitet ist,
Code:
ActionListener
implementiert und verschiedene Buttons besitzt. Ein Button ist zum Beispiel mit "Spiel starten" beschriftet, ein anderer mit "Optionen" usw.
Diese Buttons sind mit dem klasseneigenen
Code:
ActionListener
verbunden und bei einem Klick geben sie zur Zeit noch ihre Beschriftung in der Konsole aus, ohne eine weitere Bedeutung zu haben.
Allerdings passiert das alles nur in der Instanz von
Code:
Hauptmenu
, wir brauchen die Info über ein ActionEvent und vor allem, welcher Button gedrückt wurde, aber in der Instanz von
Code:
Spielfluss
.

Hat jemand eine Ahnung, wie das geht, bzw. geblickt, was ich meine? Sorry, ist ein wenig viel, aber ich dachte ich schreibe lieber zu viel als zu wenig ;)

Hier noch eine Grafik, die meinen Gedankengang beschreiben soll:
spielfluss-hauptmenu-grafik.png


Grüße und Danke im Voraus,
Roberto
 
Zuletzt bearbeitet:

Crian

Top Contributor
Ihr könntet den anderen Klassen beim Start (das übernimmt Spielfluss?) die Instanz (this) des Spielflusses mitgeben, welche ihr da (vielleicht nur als vereinfachtes Interface) vorhaltet und dann beim auftretenden Events an die Spielflussklasse weiterreicht.

Spielfluss hat ja z.B. das Hauptmenü erstellt, kennt es also und kann diesem (Objekt vorhalten) dann auch sagen (dort Methoden aufrufen), dass etwas bestimmtes eingetreten ist.

Ich hoffe ich hab das Problem verstanden.
 
T

Tomate_Salat

Gast
Zuletzt bearbeitet von einem Moderator:

robC

Mitglied
Hallo und danke für die flotten Antworten!

@Crian:
Das mit dem Übergeben der Klasse an die anderen Klassen erscheint mir plausibel. Meinst du, ich soll dann von z.B. Hauptmenu eine Methode in Spielfluss aufrufen, die das Event weiterverarbeiten kann? Außerdem verstehe ich die Anmerkung in der Klammern nicht ganz bezüglich des vereinfachten Interface. Was genau meinst du damit? (Was ein Interface ist weiß ich, habe aber noch nie wirklich damit gearbeitet und weiß dementsprechend nicht, was ich damit in diesem Fall anfangen soll)

@Tomate_Salat:
Das mit dem CardLayout scheint wohl eine fertige Klasse zu sein, die wir ansatzweise für unser Projekt schon selbst geschrieben haben... Mal wieder ein Schlag ins Gesicht :D Aber trotzdem danke, vielleicht bauen wir's noch ein!
Die anderen Hinweise / Links sind sehr interessant, ich werde mir die Konzepte und Klassen mal genauer anschauen :)

Sobald ich die bisherigen Hinweise und Tipps näher geprüft und nachvollzogen habe, melde ich mich wieder! Vielen vielen Dank nochmal für die schnellen und hilfreichen Antworten!

Güße,
Roberto
 

Crian

Top Contributor
Ich hab für eine grafische Oberflächen auch die Lösung genommen, die Verwalterklasse (dein Spielfluss) an die anderen weiterzugeben. Die speichern diese aber nicht als Spielfluss-Klasse, sondern als Ausprägung eines Interfaces. D.h. das Objekt dahinter ist natürlich die Spielflussklasse, aber die anderen Klassen müssen darüber nicht mehr wisse, als dass es ein paar Methoden gibt, die sie aufrufen können (und welche im Interface beschrieben sind).

Das ist für dieses Projekt vielleicht unnötig, aber es hilft zur Entkopplung.
 

Crian

Top Contributor
Das wäre dann etwa so:

Java:
interface Verwaltung {

    public void tuWas();

}

Java:
class Spielfluss implements Verwaltung {

    private Hauptmenue hauptmenue;

    public Spielfluss() {
        hauptmenue = new Hauptmenue(this);
    }

    // ...

    @Override
    public void tuWas() {
        // ...
        hauptmenue.reagiere();
    }

}

Java:
class Hauptmenue {

    private Verwaltung verwaltung;

    public Hauptmenue(Verwaltung verwaltung) {
        this.verwaltung = verwaltung;
    }


    // ....
        verwaltung.tuWas();
    // ...

    public void reagiere() {
        // ...
    }

}

Edit: Man kann das jetzt auch noch weiter entkoppeln und bis auf die Erstellung das hauptmenue-Objekt im Spielfluss als eine Instanz eines Interfaces ablegen, das nur "reagiere" kennt, aber das würde das ganze jetzt vielleicht ein wenig überfrachten.
 
Zuletzt bearbeitet:

robC

Mitglied
Hallo Crian!

Ich habe mir das jetzt folgendermaßen überlegt gehabt, bevor du den Code gepostet hast:

spielfluss-hauptmenu-crian.png


Frage: Wozu brauche ich das Interface? So wie du das beschrieben hast erscheint es mir nicht ganz schlüssig bzw. sinnvoll. Schließlich überschreibst du die Methode der Verwaltungsklasse lediglich mit einem Methodenaufruf der Klasse
Code:
Hauptmenu
. Kann ich die Methode nicht auch einfach so aurufen, sobald ein ActionEvent registriert wurde? (siehe Grafik)

Grüße und Danke,
Roberto
 
T

Tomate_Salat

Gast
Es geht darum, Abhängigkeiten zu vermeiden (wobei ich das Interface nicht über den Konstruktor sondern über eine add* oder set* Methode registrieren würde). Durch dieses Interface müssen sich die beiden Klasse nicht direkt kennen. Es reicht, wenn die eine Klasse weis, welche Methode Sie aufrufen muss und über Interface ist gewährleistet, dass diese vorhanden und implementiert wurde. Dadurch kannst du "einfach" Klassen austauschen (siehe MVC-Pattern).
 

Crian

Top Contributor
Zur Lösung des Problems direkt trägt die Verwendung eines Interfaces nicht bei das stimmt, aber wenn du, wie TomateSalat sagt, die Klasse austauschen willst, dann musst du nicht erst recherchieren, was alles verwendet wird (denn das steht schon im Interface), sondern musst nur drauf achten, dass die neue Klasse das Interface implementiert.

Ja über einen Setter ginge es natürlich auch. Ich wollte das ganze erstmal einfach halten. :)

Du musst es für dieses Spiel ja nicht so machen, dann schreibst du überall statt Verwaltung Spielfluss hin und fertig.


Im Spielfluss brauchst du keine Methode actionPerformed. Du kannst sie natürlich so nennen, aber meist macht man da ja speziellere Sachen. Hat also nicht eine tuWas()-Methode, sondern mehrere unterschiedliche für verschiedene Aufgaben.

So kann man auch die Logik von der Oberfläche trennen, etwa um Dateioperationen nicht mitten im Gui-Code stehen zu haben.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Die Erklärung klang IMHO sinnvoll und war gut und ausführlich, aber... wie das so ist ;) ... für mich noch nicht ausführlich genug.

"Spielfluss" steuert quasi ein "SwitchPanel", und schaltet zwischen den Panels hin und her. Wie genau ist denn jetzt die Beziehung zwischen dem "Hauptmenu" und dem "Spielfluss" (wer erstellt wen, wer steuert wen...?)

Ganz subjektiv finde ich so ein Weiterreichen von ActionEvents nicht so schön. In welchen Fällen muss eine Nachricht (d.h. ein ActionEvent) vom Spielfluss-Panel an das Hauptmenü (oder umgekehrt?) weitergereicht werden?
 

robC

Mitglied
Hallo!

Hab's jetzt so gemacht und funktioniert super! Vielen Dank für die ausführliche Erklärung.

Grüße und schönen Tag noch,
Roberto

P.S. @Tomate_Salat:
Deine Tipps werde ich mir noch genauer anschauen, brauchte jetzt aber eine schnelle und unkomplizierte Lösung, da ich bis Ende des Schuljahres fertig sein muss und mich auch noch mit meinem mündlichen Abi beschäftigen muss. Trotzdem vielen Dank!
 

robC

Mitglied
Marco13
Vielleicht hilft dir diese Grafik weiter:
spielfluss-hauptmenu-marco13.png


SpielFluss
Hat keine grafische Oberfläche sondern steuert den Spielablauf, also z.B. ruft das Hauptmenu am Anfang auf, startet das Spiel, sobald der Button im Hauptmenu gedrückt wurde, beendet das Spiel, sobald der Held gestorben ist, etc.

SwitchPanel
Ist im Prinzip ein Rahmen der von JFrame abgeleitet ist und alle Spielelemente beinhaltet (Das grafische Hauptmenü, die Spieloberfläche, eine Oberfläche, mit der Optionen gesetzt werden können, etc.

Hauptmenu, Spiel, Optionen
Sind von JPanel abgeleitet, beinhalten ihrerseits wieder Components, beispielsweise JButtons, JPanels, etc. und werden je nach bedarf von SpielFluss in das SwitchPanel geladen (vielleicht vergleichbar mit dem von TomateSalat verlinkten CardLayout).


Mein Problem war, dass ich nicht wusste, wie ich die Events, die auf die Button im Hauptmenü ausgelöst wurden, an die Spielflussklasse weiterleiten kann.

Grüße,
Roberto
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
J Java-Klasse über Konsole starten Allgemeine Java-Themen 6
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
E Klasse dynamisch über main-Methode aufrufen Allgemeine Java-Themen 9
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
E KeyCode in anderer Klasse speichern Allgemeine Java-Themen 2
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben