Java/JavaFX

JavaFX 超シンプルなデジタル時計プログラムを作成してみた

読了時間: 約433
DigitalClock

最近、あまりプログラミングをしていませんでしたね。
そこで、肩慣らし(?)の意味も込めて簡単なプログラムを作成してみることにしました。

今回作成してみたのは、「超シンプルなデジタル時計」です。
プログラミング言語はJava(JavaFX)で作成しています。

今回の記事では、JavaFX版超シンプルなデジタル時計のプログラムについての解説をしてみます。
全体のプログラムのコード量も多くなく、とてもシンプルな作りになっていますので…。
Javaプログラミングを始めたばかりの方でも十分理解できるのではないでしょうか?

開発環境

私のJavaの開発環境は以下のとおりです。

PC: MacBook Pro 2017
Java: OpenJDK 11.0.1
JavaFX: 11.0.1
IDE: IntelliJ IDEA CE 2018.3.2
Scene Builder: 10.0.0

完成イメージ

まず、最初に完成イメージをお見せします。
黒背景に白文字で、現在の日付と時刻を表示するだけの単純なプログラムとなっています。
時刻が変化すれば、当然それに伴って表示も変わります。

DigitalClock

プログラムの作成

今回のプログラム「DigitalClock」を作成する上で、新規に作成するファイルは以下の4つです。

1. module-info.java
2. Clock.fxml
3. ClockController.java
4. Main.java

module-info.java

「module-info.java」は、モジュールの制御を行うファイルです。
ここでは、JavaFXを使えるようにするための設定と、今回作成するパッケージをオープンにする設定をします。
今回のプログラムでは、com.suzushinlab.digitalclockパッケージの中にファイルを入れていきます。

module com.suzushinlab.digitalclock.DigitalClock {
    requires javafx.controls;
    requires javafx.fxml;
    opens com.suzushinlab.digitalclock;
}

Clock.fxml

「Clock.fxml」は、デジタル時計のGUIを表現しているファイルです。
BorderPaneの中央に、Labelを一つ配置しただけのシンプルな構成となっています。
基本的には、どのようなデザインにしても構いませんが…。
私と同じ設定にしたい方は以下のコードをコピーしてください。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.text.Font?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="40.0" prefWidth="280.0" style="-fx-background-color: #333333;" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.suzushinlab.digitalclock.ClockController">
   <center>
      <Label fx:id="label" alignment="CENTER" prefHeight="30.0" prefWidth="270.0" text="" textFill="#eeeeee" BorderPane.alignment="CENTER">
         <font>
            <Font name="System Bold" size="20.0" />
         </font>
      </Label>
   </center>
</BorderPane>

ClockController.java

今回のプログラムの肝となるファイルです。

initializeメソッドでは、初期化処理が行われます。
そこで、AnimationTimerを作成して、定期的にdoTaskメソッドを呼び出すように設定しています。

doTaskメソッドでは、まず現在の情報をCalendarから取得しています。
そして、日付形式にフォーマットした文字列をラベルに設定しています。

package com.suzushinlab.digitalclock;

import javafx.animation.AnimationTimer;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Label;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class ClockController {
    @FXML
    private Label label;

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd EEE HH:mm:ss", Locale.ENGLISH);

    @FXML
    public void initialize() {
        AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long l) {
                doTask();
            }
        };
        timer.start();
    }

    private void doTask() {
        Calendar calendar = Calendar.getInstance();
        String current = sdf.format(calendar.getTime());
        if(!current.equals(label.getText())) {
            Platform.runLater(() -> label.setText(current));
        }
    }
}

doTaskメソッドのif文の部分ですが…。
この処理を行うことで、時刻が変化した瞬間だけ、ラベルの文字列の更新を行うようになります。
少し効率が良くなるということですね!

Main.java

「Main.java」は、プログラムの起点となるファイルです。
Applicationクラスを継承して、startメソッドの中に処理を書いていきます。
ここでは、タイトルとシーンの設定を行った後、showメソッドで表示する、という処理を行っています。

package com.suzushinlab.digitalclock;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("Digital Clock");
        stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("Clock.fxml"))));
        stage.show();
    }
}

実行結果

このプログラム「DigitalClock」の実行結果の例は以下のとおりです。
毎秒時刻が更新されていきますよね。

DigitalClock

まとめ

今回は、超シンプルなデジタル時計プログラムをJavaFXを使って作成してみました。
いかがでしょうか?
うまく動作したでしょうか?

作成するファイルは4つのみ。
しかも、それぞれのファイルのコード量もわずか数十行程度。
とてもシンプルな構成となっていますよね。

Javaプログラミングを始めたての頃は…。
デジタル時計のような、簡単なプログラムから作成してみると良いと思います。
そして、徐々に高度なプログラムに挑戦してみる感じでしょうか。

まだまだ、私も難しいプログラムは組むことができませんので…。
もっと精進してプログラミングスキルを磨いていきたいですね。
いつか実用的なアプリを開発してみたいです。

suzushin7/DigitalClock: Very simple digital clock program in JavaFX

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です