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 JFrame
als 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.)
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle