In externer Eventhandlerklasse auf GUI-Elemente zugreifen

Status
Nicht offen für weitere Antworten.

blabla2k

Neues Mitglied
Hallo,

folgende Situation, zur Veranschaulichung möglichst einfach dargestellt:

Ich habe eine Benutzeroberfläche mit einem Button. Dieser Button soll auf einen Klick reagieren. Zu diesem Zweck füge ich ihm einen Eventlistener hinzu. Der Handler dafür soll in eine externe Klasse, da er relativ viel Programmlogik enthält und daher aus Gründen der sauberen Programmierung von der GUI getrennt werden soll.

In diesem Handler will ich auf verschiedene Elemente (Textfelder, Listen...) der Benutzeroberfläche zugreifen. Diese Elemente sind im Eventhandler natürlich erst mal nicht zugänglich. Jetzt habe ich überlegt, wie ich das anstellen könnte, aber habe keine Methode gefunden die mich wirklich zufriedenstellt:


1. Die betreffenden Steuerelemente in der Formularklasse als statisch definieren, dann der GUI-Klasse entsprechende statische get-Methoden hinzufügen. Dann kann ich im Handler so darauf zugreifen: TestForm.getInfoTextField().getText()

Diese Lösung ist deshalb nicht so gut, weil die Steuerelemente eigentlich nicht statisch sein sollen. Vielleicht soll es ja mehrere Instanzen der Formularklasse(n) geben.

2. Der Formularklasse get-Methoden für die Formulare hinzufügen und dann dem Eventhandler eine Instanz der Formularklasse im Konstruktor übergeben.

Funktioniert an sich gut, aber was ist, wenn ich im Eventhandler auch noch auf andere Formulare zugreifen will als die, die den Eventlistener angemeldet haben? Es kann sein, dass von diesen Formularen noch gar keine Instanz vorhanden ist, wenn ich den Eventlistener anmelde, also kann ich diese Formulare nicht dem Eventhandler übergeben.

3. Formulare als Singleton-Klassen definieren und dann im Eventhandler die jeweilige Instanz abholen


Funktioniert an sich auch gut, aber hat wiederum die Limitierung, dass es nur eine Instanz jedes Formulares geben kann.

4. Die Steuerelemente direkt dem Konstruktor des Eventhandlers übergeben

Auch eine Möglichkeit, ist aber inakzeptabel, wenn eine große Anzahl von Steuerelementen zugänglich gemacht werden sollen.



Also das sind die Möglichkeiten die mir bisher eingefallen sind. Vielleicht sind auch einige davon völlig verpönt oder ungebräuchlich, aber ich tue mich echt schwer eine Lösung zu finden. Es soll auch nicht einfach nur funktionieren, sondern möglichst elegant und effizient gelöst werden.
 

Marco13

Top Contributor
Vergiß' static und Singleton.

Eine "Mischung" aus 2 und 4 ... eher in Richtung 2 gehend, wo ich das Problem nocht nicht verstanden habe... du hast also eine Klasse
class MainControl extends JPanel ...
mit ein paar Buttons, TextFields und so drauf, und willst jetzt an einen Button einen
class Handler implements ActionListener
oder so hängen, der u.a. auch auf die TextFields zugreift? Dann kann dieser Handler (ggf. gleich im Konstruktor) das "MainControl" übergeben bekommen.

Und wenn ich es richtig verstanden habe, kann es jetzt eine andere Klasse geben
class OtherControl extends JPanel
die andere TextFields oder so enthält, und auf die der Handler AUCH zugreifen muss? Falls das das Problem ist, stellen sich 2 Fragen: Was passiert, wenn dieses zweite Panel nicht erstellt wird (also, ist das "überlebenswichtig" für den Handler?) und wer erstellt diese beiden Panels (MainControl und OtherControl)? GGf. könnte DERjenige ja auch den Handler erstellen, und die beiden Panels dann an den Handler übergeben ... sinngemäß sowas wie
Code:
class Main
{
    void doit()
    {
        ControlPanel a = new ControlPanel(); 
        OtherPanel b = new OtherPanel();
        Handler h = new Handler(a,b);
        a.addAsListener(h);
    }
}
(ganz, ganz grob ... ggf könnte das "OtherPanel" auch später mit einer set-Methode an den Listener übergeben werden oder so ... das hängt dann mit der ersten Frage zusammen...)

}
 

blabla2k

Neues Mitglied
Hallo Marco,

danke für die schnelle Antwort :)

Ich lese gleich in Ruhe deine Antwort, ich schreibe erstmal schnell wie es konkret sein soll:

Ich habe zwei Formulare, ein MainForm und ein DialogForm (DialogForm wird mit einem Button aus der MainForm geöffnet, dort kann man dann einige Optionen setzen die sich auf die MainForm auswirken, und dann schließt man es wieder).

Im DialogForm ist dann beispielsweise ein Button, und wenn man den anklickt, sollen gewisse Steuerelemente sowohl in der MainForm als auch in der DialogForm aktualisiert werden. Der Eventhandler dafür muss also auf beide Formulare zugriff haben.

Sollte ich dann vielleicht ein Feld MainForm der DialogForm-Klasse hinzufügen, das dann per Konstruktorübergabe gesetzt wird, wenn MainForm eine Instanz von DialogForm erstellt? Also:
new DialogForm(this)

und dann wenn ich in DialogForm den Eventhandler anmelde, könnte ich beide Formulare übergeben:
this (das DialogForm selbst) und this.MainForm (das Hauptformular, was ich per Konstruktor übergeben habe). So hätte der Eventhandler, der in DialogForm angemeldet wird, beide Formulare zur Verfügung.
Würde man das so machen? Es würde bestimmt gehen, aber es kommt mir irgendwie frickelig vor.

Der Fall, dass das zweite Panel (also in diesem Fall MainForm) nicht vorhanden ist, wird logischerweise nie eintreten, da es ja selber das erste Panel erstellt. Also wäre zumindest das kein Problem.


Noch eine kleine Frage direkt zu den Formularen: Sollte man jedesmal, wenn der Benutzer aus dem MainForm das DialogForm aufruft, eine neue Instanz der DialogForm erstellen, und diese dann wieder zerstören wenn es geschlossen wird? Oder sollte man schon beim Laden von MainForm eine Instanz von DialogForm erstellen und diese dann nur sichtbar und unsichtbar machen?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm. Erstmal kurz zum letzten Punkt: Das hängt davon ab, ob das immer wieder der selbe oder immer wieder der gleiche Dialog ist. Wenn man immer wieder den selben Dialog verwendet, stehen dort natürlich ggf. noch die Eingaben vom letzten Öffnen drin. Das kann erwünscht sein, oder nicht.


Und sonst: Man könnte jetzt etliche mögliche Abstraktionen vorschlagen. Nur kann es gut sein, dass die ein Overkill wären. Wird diese DialogForm immer von der MainForm aus geöffnet? Kann man mit 100%iger Sicherheit sagen, dass die DialogForm NIE existieren wird, wenn es die MainForm nicht gibt? Dann kann die DialogForm auch die MainForm im Konstruktor übergeben bekommen.
Wenn die DialogForm aber auch von "irgendwo anders aus" geöffnet werden kann, und dort ggf. garkeine MainForm verfügbar ist, KÖNNTE(!) eine andere Struktur sinnvoller sein. (Ob man dann ggf. dem Konsruktor einfach 'null' übergeben könnte, müßte man sich überlegen...)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
F Swing ImageIcons von externer Quelle (relativ) AWT, Swing, JavaFX & SWT 6
D Panel aus externer Klasse holen AWT, Swing, JavaFX & SWT 2
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
S AWT Arrays in externer jTable Klasse ausgeben AWT, Swing, JavaFX & SWT 3
P JMenu-Erweiterung in externer Datei AWT, Swing, JavaFX & SWT 5
M Probleme mit JFrame und nicht angezeigter externer Klasse AWT, Swing, JavaFX & SWT 8
J Aufruf externer Quellen aus java AWT, Swing, JavaFX & SWT 3
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
M Swing JList - Elemente umbenennen? AWT, Swing, JavaFX & SWT 4
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
H [gelöst] Swing Elemente verdecken AWT, Swing, JavaFX & SWT 14
K BoxLayout skaliert die "falschen" Elemente AWT, Swing, JavaFX & SWT 5
A SWT - Elemente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
S Andere Elemente in JComboBox anzeigen AWT, Swing, JavaFX & SWT 2
T Elemente werden nicht direkt angezeigt AWT, Swing, JavaFX & SWT 3
S Nachträglich Swing-Elemente in JFrame erzeugen AWT, Swing, JavaFX & SWT 18
K Titel für eingebundene Elemente wie JPanel AWT, Swing, JavaFX & SWT 3
F Dynamische Swing Elemente AWT, Swing, JavaFX & SWT 10
B Grafische Anordnung der Elemente AWT, Swing, JavaFX & SWT 2
S JComboBox zeigt beim 1. öffnen nur 2 Elemente ? AWT, Swing, JavaFX & SWT 9
J LayoutManager der Elemente untereinander anordnet. AWT, Swing, JavaFX & SWT 11
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben