J'ai créé une horloge mondiale en utilisant Java Swing. L'horloge elle-même n'est pas très complexe. La raison pour laquelle j'ai réalisé ce mini-projet était de voir si je pouvais personnaliser les fuseaux horaires.
Voici l'interface graphique avec les fuseaux horaires par défaut.
Voici le JDialog
qui montre les différents fuseaux horaires à travers le monde.
Vous pouvez sélectionner autant de fuseaux horaires que vous le souhaitez, même si je suggère que 10 fuseaux horaires constituent la limite pratique pour la plupart des affichages actuels.
Thw JDialog
vous permet de déplacer les fuseaux horaires de la liste principale vers la liste d'affichage, et de la liste d'affichage vers la liste principale. Vous pouvez effacer tous les fuseaux horaires affichés si vous souhaitez recommencer. Vous devez sélectionner au moins un fuseau horaire à afficher,
La liste principale reste par ordre alphabétique. La liste d'affichage affiche les fuseaux horaires dans l'ordre dans lequel vous les sélectionnez. Maintenir la touche Ctrl
tout en cliquant avec le bouton gauche de la souris vous permet de sélectionner plusieurs fuseaux horaires à ajouter ou à supprimer des listes.
Ce code n'enregistre pas les fuseaux horaires que vous sélectionnez dans un fichier de propriétés. C'est quelque chose qui peut être ajouté si vous souhaitez utiliser cette horloge mondiale comme fichier JAR exécutable.
Oracle propose un didacticiel utile, Création d'une interface graphique avec Swing. Évitez le Learning Swing avec la section NetBeans IDE.
Lorsque je crée une application Swing, j'utilise le modèle modèle-vue-contrôleur (MVC). Ce modèle me permet de séparer mes préoccupations et de me concentrer sur une partie de l'application Swing à la fois. Le nom du modèle implique que vous créez d'abord le modèle, puis la vue et enfin le contrôleur. Il s'agit d'un processus itératif, donc les modifications apportées à la vue ou au contrôleur peuvent entraîner des modifications dans le modèle.
Pour une application Swing, le modèle MVC signifie :
La vue lit les informations du modèle.
La vue ne met pas à jour le modèle.
Le contrôleur met à jour le modèle et repeint/revalide la vue.
Il n’y a généralement pas un seul contrôleur pour « les gouverner tous ». Chaque Action
ou ActionListener
agit indépendamment et met à jour sa partie du modèle et de la vue.
J'ai créé une classe de modèle, la classe WorldClockModel
. Cette classe contient une date et une heure actuelles ZonedDateTime
, une java.util.List
de tous les fuseaux horaires et une java.util.List
des fuseaux horaires à afficher. J'ai choisi un ZonedDateTime
pour ne pouvoir stocker l'heure actuelle qu'une seule fois. Je peux transmettre un ZoneId
au ZonedDateTime
pour obtenir l'heure actuelle dans n'importe quel fuseau horaire.
La List
de tous les fuseaux horaires provient de la méthode ZoneId
getAvailableZoneIds
. Je filtre les fuseaux horaires qui ne sont pas liés à la ville.
J'ai créé deux classes de vue, la classe WorldClockGUI
et la classe DisplayPanel
. La classe WorldClockGUI
crée le JFrame
et le JPanel
principal. Le JPanel
principal est composé d'instances DisplayPanel
, une pour chaque fuseau horaire à afficher.
Le JFrame
a un BorderLayout
par défaut, j'ai donc placé le JPanel
principal au centre du BorderLayout
. Le JPanel
principal utilise un GridLayout
pour placer les instances DisplayPanel
dans deux colonnes régulièrement espacées.
Le JDialog
affiche la liste de tous les fuseaux horaires, la liste des fuseaux horaires affichés et contrôle JButtons
pour déplacer les fuseaux horaires d'une liste à l'autre. J'utilise deux DefaultListModels
, un pour chaque liste.
La classe TimezoneDialogListener
copie la liste d'affichage de l'affichage DefaultListModel
vers la classe de modèle d'application et met à jour la vue.
Un Swing Timer
met à jour l’heure actuelle toutes les 20 secondes. C'est suffisamment précis pour une horloge qui affiche les heures et les minutes.
Le reste des JButtons
du JDialog
déclenchent ActionListeners
anonymes pour effectuer leurs tâches. Les auditeurs sont petits, il était donc logique de leur donner des cours anonymes.