Entwurfsmuster für die Fensterverwaltung in einer Java Swing-App


9

Ich habe gerade angefangen, meine allererste kleine Java Swing-App zu erstellen. Wenn das Programm geöffnet wird, wird ein einzelnes, einfaches Fenster mit einer Beschriftung und einigen Schaltflächen angezeigt. Durch Klicken auf eine dieser Schaltflächen wird der Begrüßungsbildschirm gelöscht und durch ein völlig anderes Bedienfeld ersetzt.

Ich bin mir nicht sicher, wie ich diese Funktionalität am besten erstellen kann. Eine Methode wäre, meine JFrameals Argument an ... fast jede andere Komponente weiterzugeben, aber das fühlt sich für mich hackig an. Oder es wird jedes Panel als Action-Listener verwendet, aber das scheint auch nicht richtig zu sein.

Gibt es ein Designmuster, das ich hier anwenden sollte? "Ersetzen Sie den Inhalt des Haupt- und einzigen Fensters" muss eine recht häufige Operation sein. Ein Name für das Muster würde ausreichen; Von dort aus kann ich Google alleine verwenden. (Zu einer längeren Erklärung würde ich allerdings nicht nein sagen.)


Da es sich um eine Frage zu den tatsächlichen Programmiertechniken handelt, erhalten Sie wahrscheinlich viel mehr Antworten auf den Stapelüberlauf.
Alex Feinman

Antworten:


6

Beim Erstellen von Swing-Apps stütze ich mich normalerweise auf das Mediator-Muster. In diesem Muster behandelt eine Mediator-Klasse (normalerweise der Haupt-JFrame) die verschiedenen GUI-Teile (normalerweise die JPanels, JMenus ...) und kümmert sich um die Kommunikation zwischen ihnen.

Wenn beispielsweise in JPanel1 ein Ereignis aufgetreten ist, benachrichtigt JPanel1 den Mediator (den JFrame). Der JFrame ergreift dann Maßnahmen, indem er JPanel2 ändert.

Zu Ihrer Information: Alle meine Projekte waren kleine bis mittlere GUI-Apps, daher bin ich mir nicht sicher, ob sich diese Muster gut skalieren lassen. Wenn Sie jedoch eine angemessene Architektur entwerfen könnten, könnte das Mediator-Muster eine solide Basis sein.


4

Sie können die Hauptmethode einen JDialog anzeigen lassen. Wenn der Dialog geschlossen wird, wird der Haupt-JFrame erstellt und angezeigt.

JDialog bietet Ihnen benutzerfreundliche statische Methoden, die einen Dialog mit benutzerdefinierten Inhalten und Schaltflächen anzeigen und den Code der angeklickten Schaltfläche zurückgeben. Durch Testen dieses Werts kann Ihre Hauptmethode entscheiden, ob entweder der Hauptrahmen angezeigt oder beendet werden soll (oder etwas anderes). Bitte lesen Sie den Javadoc.

Im Gegensatz zu einigen älteren UI-Frameworks ist eine Swing-Anwendung nicht an einen bestimmten Frame oder ein bestimmtes Fenster gebunden. Sie können so viele Fenster erstellen, wie Sie möchten. Die Anwendung endet, wenn alle Threads beendet sind, nicht wenn alle Fenster entsorgt wurden. Dies wird normalerweise mit System.exit (0) erreicht.

Ich weiß nicht, ob es für diesen Fall ein bestimmtes Entwurfsmuster gibt. Ich empfehle das Java Swing Tutorial.


1
-1. Dies ist eine Entwurfsmusterfrage. Die Empfehlung, die Spezifikationen zu ändern, die mir gegeben wurden, und die Endung mit "Ich weiß nicht, ob es ein bestimmtes Entwurfsmuster gibt", beantwortet dies nicht.
Pops

2
Seine Antwort ist sehr genau. Sie haben kein Entwurfsmusterproblem, sondern müssen zunächst lernen, wie Formulare und Dialoge funktionieren.
Alex

2

Viele UI-Frameworks haben unterschiedliche Regeln bezüglich des Hauptfensters oder des aktiven Fensters. Eine Möglichkeit, diese Komplexität zu bewältigen, besteht darin, dass Ihr Hauptfenster, das die Hauptnachrichtenschleife steuert, unsichtbar ist (oder ein kleines, chromloses 1-Pixel-Fenster außerhalb des Bildschirms für die besonders nervigen Frameworks). Lassen Sie dann alle anderen Fenster und Dialoge ein untergeordnetes Element dieses Fensters sein.

Diese Methode bietet viele Vorteile, insbesondere beim Umgang mit globalen Tastenklicks und Mausereignissen sowie bei der Protokollierung und Ausnahmebehandlung auf höchster Ebene.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.