我使用 Java Swing 創建了一個世界時鐘。 時鐘本身並不是很複雜。 我做這個迷你專案的原因是看看我是否可以自訂時區。
這是一個帶有預設時區的 GUI。
這是顯示世界各地各個時區的JDialog
。
您可以根據需要選擇任意多個時區,但我建議 10 個時區是大多數目前顯示的實際限制。
Thw JDialog
可讓您將時區從主列表移至顯示列表,並從顯示列表移至主列表。 如果您想重新開始,您可以清除所有顯示的時區。 您必須至少選擇一個時區來顯示,
主要清單仍按字母順序排列。 顯示清單會依照您選擇的順序顯示時區。 按住Ctrl
鍵的同時點選滑鼠左鍵可以選擇要在清單中新增或刪除的多個時區。
此程式碼不會將您選擇的時區儲存到屬性檔案中。 如果您想將此世界時鐘用作可執行 JAR 文件,則可以新增此內容。
Oracle 有一個有用的教學:使用 Swing 建立 GUI。 跳過使用 NetBeans IDE 學習 Swing 部分。
當我建立 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
複製回應用程式模型類別並更新視圖。
Swing Timer
每 20 秒更新一次目前時間。 對於顯示小時和分鐘的時鐘來說,這已經足夠準確了。
JDialog
上的其餘JButtons
會觸發匿名ActionListeners
來執行其任務。 偵聽器很短,因此將它們設為匿名類別是有意義的。