Ich habe mit Java Swing eine Weltzeituhr erstellt. Die Uhr selbst ist nicht sehr komplex. Der Grund, warum ich dieses Miniprojekt gemacht habe, war, herauszufinden, ob ich die Zeitzonen anpassen kann.
Hier ist die GUI mit den Standardzeitzonen.
Hier ist der JDialog
, der die verschiedenen Zeitzonen auf der ganzen Welt anzeigt.
Sie können so viele Zeitzonen auswählen, wie Sie möchten. Ich würde jedoch vorschlagen, dass 10 Zeitzonen die praktische Grenze für die meisten aktuellen Displays darstellen.
Mit JDialog
können Sie Zeitzonen von der primären Liste in die Anzeigeliste und von der Anzeigeliste in die primäre Liste verschieben. Sie können alle angezeigten Zeitzonen löschen, wenn Sie von vorne beginnen möchten. Sie müssen mindestens eine Zeitzone zur Anzeige auswählen.
Die Primärliste bleibt in alphabetischer Reihenfolge. In der Anzeigeliste werden die Zeitzonen in der Reihenfolge angezeigt, in der Sie sie auswählen. Wenn Sie die Ctrl
Taste gedrückt halten und gleichzeitig mit der linken Maustaste klicken, können Sie mehrere Zeitzonen auswählen, um sie den Listen hinzuzufügen oder daraus zu entfernen.
Dieser Code speichert die von Ihnen ausgewählten Zeitzonen nicht in einer Eigenschaftendatei. Dies kann hinzugefügt werden, wenn Sie diese Weltuhr als ausführbare JAR-Datei verwenden möchten.
Oracle hat ein hilfreiches Tutorial: Erstellen einer GUI mit Swing. Überspringen Sie den Lernschwung mit dem NetBeans-IDE-Bereich.
Wenn ich eine Swing-Anwendung erstelle, verwende ich das Model-View-Controller-Muster (MVC). Dieses Muster ermöglicht es mir, meine Anliegen zu trennen und mich jeweils auf einen Teil der Swing-Anwendung zu konzentrieren. Der Mustername impliziert, dass Sie zuerst das Modell, dann die Ansicht und schließlich den Controller erstellen. Da es sich um einen iterativen Prozess handelt, können Änderungen in der Ansicht oder im Controller zu Änderungen im Modell führen.
Für eine Swing-Anwendung bedeutet das MVC-Muster:
Die Ansicht liest Informationen aus dem Modell.
Die Ansicht aktualisiert das Modell nicht.
Der Controller aktualisiert das Modell und malt/validiert die Ansicht neu.
Normalerweise gibt es keinen einzigen Controller, der „alle regiert“. Jede Action
oder ActionListener
agiert unabhängig und aktualisiert seinen Teil des Modells und der Ansicht.
Ich habe eine Modellklasse erstellt, die WorldClockModel
-Klasse. Diese Klasse enthält ein ZonedDateTime
aktuelles Datum und eine aktuelle Uhrzeit, eine java.util.List
aller Zeitzonen und eine java.util.List
der anzuzeigenden Zeitzonen. Ich habe eine ZonedDateTime
gewählt, damit ich die aktuelle Uhrzeit nur einmal speichern muss. Ich kann eine ZoneId
an ZonedDateTime
übergeben, um die aktuelle Zeit in jeder Zeitzone zu erhalten.
Die List
aller Zeitzonen stammt von der ZoneId
getAvailableZoneIds
-Methode. Ich filtere die Zeitzonen heraus, die keinen Bezug zur Stadt haben.
Ich habe zwei Ansichtsklassen erstellt, die WorldClockGUI
-Klasse und die DisplayPanel
-Klasse. Die WorldClockGUI
-Klasse erstellt den JFrame
und das Haupt- JPanel
. Das Haupt- JPanel
besteht aus DisplayPanel
-Instanzen, eine für jede anzuzeigende Zeitzone.
Der JFrame
verfügt über ein Standard BorderLayout
, daher habe ich das Haupt JPanel
in der Mitte des BorderLayout
platziert. Das Haupt JPanel
verwendet ein GridLayout
um die DisplayPanel
Instanzen in zwei gleichmäßig verteilte Spalten zu platzieren.
Der JDialog
zeigt die Liste aller Zeitzonen, die Liste der angezeigten Zeitzonen und Steuer- JButtons
zum Verschieben von Zeitzonen von einer Liste in die andere. Ich verwende zwei DefaultListModels
, eines für jede Liste.
Die TimezoneDialogListener
-Klasse kopiert die Anzeigeliste aus dem Anzeige- DefaultListModel
zurück in die Anwendungsmodellklasse und aktualisiert die Ansicht.
Ein Swing- Timer
aktualisiert alle 20 Sekunden die aktuelle Zeit. Das ist genau genug für eine Uhr, die Stunden und Minuten anzeigt.
Die restlichen JButtons
im JDialog
lösen anonyme ActionListeners
aus, um ihre Aufgaben auszuführen. Die Zuhörer sind klein, daher war es sinnvoll, sie in anonyme Klassen einzuteilen.