Java Swing을 사용하여 세계시계를 만들었습니다. 시계 자체는 그다지 복잡하지 않습니다. 제가 이 미니 프로젝트를 한 이유는 시간대를 맞춤 설정할 수 있는지 확인하기 위해서였습니다.
기본 시간대가 포함된 GUI는 다음과 같습니다.
다음은 전 세계의 다양한 시간대를 보여주는 JDialog
입니다.
원하는 만큼 시간대를 선택할 수 있지만, 대부분의 최신 디스플레이에서는 10개의 시간대가 실제 제한이 되는 것이 좋습니다.
JDialog
사용하면 시간대를 기본 목록에서 표시 목록으로, 표시 목록에서 기본 목록으로 이동할 수 있습니다. 다시 시작하려면 표시된 시간대를 모두 지울 수 있습니다. 표시할 시간대를 하나 이상 선택해야 합니다.
기본 목록은 알파벳순으로 유지됩니다. 표시 목록에는 선택한 순서대로 시간대가 표시됩니다. Ctrl
키를 누른 채 마우스 왼쪽 버튼을 클릭하면 여러 시간대를 선택하여 목록에 추가하거나 제거할 수 있습니다.
이 코드는 선택한 시간대를 속성 파일에 저장하지 않습니다. 이 세계 시계를 실행 가능한 JAR 파일로 사용하려는 경우 추가할 수 있는 것입니다.
Oracle에는 Swing을 사용하여 GUI 만들기라는 유용한 튜토리얼이 있습니다. NetBeans IDE 섹션을 통한 학습 스윙을 건너뛰세요.
저는 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초마다 현재 시간을 업데이트합니다. 이는 시간과 분을 표시하는 시계에 대해 충분히 정확합니다.
JDialog
의 나머지 JButtons
익명 ActionListeners
트리거하여 해당 작업을 수행합니다. 청취자가 짧기 때문에 익명 클래스를 만드는 것이 합리적입니다.