Я создал мировые часы с помощью Java Swing. Сами часы не очень сложны. Причина, по которой я сделал этот мини-проект, заключалась в том, чтобы посмотреть, смогу ли я настроить часовые пояса.
Вот графический интерфейс с часовыми поясами по умолчанию.
Вот JDialog
, который показывает различные часовые пояса по всему миру.
Вы можете выбрать столько часовых поясов, сколько захотите, хотя я бы предположил, что 10 часовых поясов — это практический предел для большинства современных дисплеев.
Thw JDialog
позволяет перемещать часовые пояса из основного списка в список отображения и из списка отображения в основной список. Вы можете очистить все отображаемые часовые пояса, если хотите начать все сначала. Вы должны выбрать хотя бы один часовой пояс для отображения,
Основной список остается в алфавитном порядке. В списке отображения часовые пояса отображаются в том порядке, в котором вы их выбираете. Удерживая клавишу Ctrl
при щелчке левой кнопкой мыши, вы можете выбрать несколько часовых поясов для добавления или удаления из списков.
Этот код не сохраняет выбранные вами часовые пояса в файл свойств. Это можно добавить, если вы хотите использовать мировые часы в качестве исполняемого файла JAR.
У Oracle есть полезное руководство «Создание графического интерфейса с помощью Swing». Пропустите раздел «Обучение с использованием среды IDE NetBeans».
Когда я создаю приложение Swing, я использую шаблон модель-представление-контроллер (MVC). Этот шаблон позволяет мне разделить мои заботы и сосредоточиться на одной части приложения Swing за раз. Название шаблона подразумевает, что сначала вы создаете модель, затем представление и, наконец, контроллер. Это итеративный процесс, поэтому изменения в представлении или контроллере могут привести к изменениям в модели.
Для приложения Swing шаблон MVC означает:
Представление считывает информацию из модели.
Представление не обновляет модель.
Контроллер обновляет модель и перерисовывает/перепроверяет представление.
Обычно не существует одного контролера, который бы «управлял всеми». Каждый Action
или ActionListener
действует независимо и обновляет свою часть модели и представления.
Я создал один класс модели — класс WorldClockModel
. Этот класс содержит текущую дату и время ZonedDateTime
, java.util.List
всех часовых поясов и java.util.List
отображаемых часовых поясов. Я выбрал ZonedDateTime
, чтобы мне нужно было сохранить текущее время только один раз. Я могу передать ZoneId
в ZonedDateTime
чтобы получить текущее время в любом часовом поясе.
List
всех часовых поясов получается из метода ZoneId
getAvailableZoneIds
. Я отфильтровываю часовые пояса, не связанные с городом.
Я создал два класса представлений: класс WorldClockGUI
и класс DisplayPanel
. Класс WorldClockGUI
создает JFrame
и основную JPanel
. Основная JPanel
состоит из экземпляров DisplayPanel
, по одному для каждого отображаемого часового пояса.
JFrame
имеет BorderLayout
по умолчанию, поэтому я разместил основную JPanel
в центре BorderLayout
. Основная JPanel
использует GridLayout
для размещения экземпляров DisplayPanel
в двух равномерно расположенных столбцах.
JDialog
показывает список всех часовых поясов, список отображаемых часовых поясов и управляющие JButtons
для перемещения часовых поясов из одного списка в другой. Я использую две DefaultListModels
, по одной для каждого списка.
Класс TimezoneDialogListener
копирует список отображения из отображения DefaultListModel
обратно в класс модели приложения и обновляет представление.
Timer
качания обновляет текущее время каждые 20 секунд. Это достаточно точно для часов, показывающих часы и минуты.
Остальные JButtons
в JDialog
запускают анонимные ActionListeners
для выполнения своих задач. Слушателей мало, поэтому имело смысл создать для них анонимные классы.