Java Swingを使用して世界時計を作成しました。 時計自体はそれほど複雑ではありません。 このミニプロジェクトを行った理由は、タイムゾーンをカスタマイズできるかどうかを確認するためでした。
以下は、デフォルトのタイムゾーンを含む GUI です。
これは、世界中のさまざまなタイムゾーンを示すJDialog
です。
タイム ゾーンは必要なだけ選択できますが、現在のほとんどのディスプレイでは 10 タイム ゾーンが実際的な制限であることをお勧めします。
JDialog
を使用すると、タイム ゾーンをプライマリ リストから表示リストに移動したり、表示リストからプライマリ リストに移動したりできます。 最初からやり直す場合は、表示されているタイムゾーンをすべてクリアできます。 表示するには少なくとも 1 つのタイムゾーンを選択する必要があります。
プライマリ リストはアルファベット順のままです。 表示リストには、選択した順序でタイムゾーンが表示されます。 Ctrl
キーを押したままマウスを左クリックすると、複数のタイム ゾーンを選択してリストに追加またはリストから削除できます。
このコードは、選択したタイム ゾーンをプロパティ ファイルに保存しません。 これは、この世界時計を実行可能な JAR ファイルとして使用する場合に追加できるものです。
Oracle には、Swing を使用した GUI の作成という便利なチュートリアルがあります。 「NetBeans IDE を使用した Swing の学習」セクションをスキップしてください。
Swing アプリケーションを作成するときは、モデル ビュー コントローラー (MVC) パターンを使用します。 このパターンを使用すると、懸念事項を分離して、一度に Swing アプリケーションの 1 つの部分に集中することができます。 パターン名は、最初にモデルを作成し、次にビュー、最後にコントローラーを作成することを意味します。 これは反復プロセスであるため、ビューまたはコントローラーの変更によりモデルが変更される可能性があります。
Swing アプリケーションの場合、MVC パターンは次のことを意味します。
ビューはモデルから情報を読み取ります。
ビューはモデルを更新しません。
コントローラーはモデルを更新し、ビューを再描画/再検証します。
通常、「すべてを制御する」1 つのコントローラーはありません。 各Action
またはActionListener
独立して動作し、モデルとビューのその部分を更新します。
WorldClockModel
クラスという 1 つのモデル クラスを作成しました。 このクラスは、 ZonedDateTime
現在の日付と時刻、すべてのタイム ゾーンのjava.util.List
、および表示されるタイム ゾーンのjava.util.List
を保持します。 現在時刻を 1 回保存するだけで済むように、 ZonedDateTime
選択しました。 ZoneId
ZonedDateTime
に渡すと、任意のタイム ゾーンの現在時刻を取得できます。
すべてのタイム ゾーンのList
、 ZoneId
getAvailableZoneIds
メソッドから取得されます。 都市に関係のないタイムゾーンを除外します。
WorldClockGUI
クラスとDisplayPanel
クラスという 2 つのビュー クラスを作成しました。 WorldClockGUI
クラスは、 JFrame
とメインJPanel
を作成します。 メインのJPanel
は、表示されるタイム ゾーンごとに 1 つずつあるDisplayPanel
インスタンスで構成されます。
JFrame
はデフォルトのBorderLayout
あるため、メインのJPanel
BorderLayout
の中央に配置しました。 メインのJPanel
GridLayout
使用して、 DisplayPanel
インスタンスを 2 つの等間隔の列に配置します。
JDialog
すべてのタイム ゾーンのリスト、表示されているタイム ゾーンのリストが表示され、タイム ゾーンをあるリストから別のリストに移動するためのJButtons
を制御します。各リストに 1 つずつ、2 つのDefaultListModels
使用します。
TimezoneDialogListener
クラスは、表示リストを表示DefaultListModel
からアプリケーション モデル クラスにコピーして戻し、ビューを更新します。
スイングTimer
現在時刻を 20 秒ごとに更新します。 これは、時間と分を表示する時計としては十分な精度です。
JDialog
上の残りのJButtons
は、匿名のActionListeners
トリガーしてタスクを実行します。 リスナーは短いので、匿名クラスを作成するのが理にかなっています。