Criei um relógio mundial usando Java Swing. O relógio em si não é muito complexo. A razão pela qual fiz este miniprojeto foi para ver se conseguia personalizar os fusos horários.
Aqui está a GUI com os fusos horários padrão.
Aqui está o JDialog
que mostra os vários fusos horários ao redor do mundo.
Você pode selecionar quantos fusos horários desejar, embora eu sugira que 10 fusos horários seja o limite prático para a maioria das exibições atuais.
Thw JDialog
permite mover fusos horários da lista primária para a lista de exibição e da lista de exibição para a lista primária. Você pode limpar todos os fusos horários exibidos se quiser recomeçar. Você deve selecionar pelo menos um fuso horário para exibir,
A lista primária permanece em ordem alfabética. A lista de exibição exibe os fusos horários na ordem em que você os seleciona. Manter pressionada a tecla Ctrl
enquanto clica com o botão esquerdo do mouse permite selecionar vários fusos horários para adicionar ou remover das listas.
Esse código não salva os fusos horários selecionados em um arquivo de propriedades. Isso é algo que pode ser adicionado se você quiser usar este relógio mundial como um arquivo JAR executável.
A Oracle tem um tutorial útil, Criando uma GUI com Swing. Ignore o aprendizado com a seção NetBeans IDE.
Quando crio um aplicativo Swing, uso o padrão model-view-controller (MVC). Esse padrão me permite separar minhas preocupações e focar em uma parte do aplicativo Swing por vez. O nome do padrão implica que você crie primeiro o modelo, depois a visualização e, finalmente, o controlador. Este é um processo iterativo, portanto, alterações na visualização ou no controlador podem causar alterações no modelo.
Para uma aplicação Swing, o padrão MVC significa:
A visualização lê informações do modelo.
A visualização não atualiza o modelo.
O controlador atualiza o modelo e repinta/revalida a visualização.
Geralmente não há um controlador para "governar todos eles". Cada Action
ou ActionListener
atua de forma independente e atualiza sua parte do modelo e da visualização.
Criei uma classe de modelo, a classe WorldClockModel
. Esta classe contém uma data e hora atuais ZonedDateTime
, um java.util.List
de todos os fusos horários e um java.util.List
dos fusos horários a serem exibidos. Escolhi um ZonedDateTime
para que só precise armazenar a hora atual uma vez. Posso passar um ZoneId
para ZonedDateTime
para obter a hora atual em qualquer fuso horário.
A List
de todos os fusos horários vem do método ZoneId
getAvailableZoneIds
. Eu filtro os fusos horários que não estão relacionados à cidade.
Criei duas classes de visualização, a classe WorldClockGUI
e a classe DisplayPanel
. A classe WorldClockGUI
cria o JFrame
e o JPanel
principal. O JPanel
principal é composto por instâncias DisplayPanel
, uma para cada fuso horário a ser exibido.
O JFrame
tem um BorderLayout
padrão, então coloquei o JPanel
principal no centro do BorderLayout
. O JPanel
principal usa um GridLayout
para colocar as instâncias DisplayPanel
em duas colunas com espaçamento uniforme.
O JDialog
mostra a lista de todos os fusos horários, a lista de fusos horários exibidos e JButtons
de controle para mover os fusos horários de uma lista para outra. Eu uso dois DefaultListModels
, um para cada lista.
A classe TimezoneDialogListener
copia a lista de exibição do display DefaultListModel
de volta para a classe de modelo de aplicativo e atualiza a visualização.
Um Swing Timer
atualiza a hora atual a cada 20 segundos. Isso é preciso o suficiente para um relógio que exibe horas e minutos.
O restante dos JButtons
no JDialog
acionam ActionListeners
anônimos para executar suas tarefas. Os ouvintes são baixos, então fazia sentido criar aulas anônimas para eles.