Javaでストップウォッチ(タイマー)を作成する方法を現役エンジニアが解説【初心者向け】

初心者向けにJavaでストップウォッチ(タイマー)を作成する方法について解説しています。ここではJavaFXライブラリを使用してタイマーを作成する方法を紹介します。サンプルコードで動作を確認してみましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Javaでストップウォッチ(タイマー)を作成する方法について解説します。実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

ストップウォッチ(タイマー)を作成する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

ストップウォッチを作成する方法

JavaFXライブラリを利用して開始ボタンと停止ボタンで時間を計測できるストップウォッチを作成します。JavaFXライブラリはjavaで画面付きのアプリケーションを作成できるライブラリです。

ストップウォッチの機能は以下の通りとします。

  1. 開始ボタンで時間計測を開始
  2. 停止ボタンで時間計測を停止
  3. リセットボタンで計測時間を0に戻す
  4. リセットボタンを押さずに開始と停止を繰り返した場合は、開始後から停止までの経過時間が加算される。
  5. 経過時間は画面に表示し続ける

 

実際に書いてみよう

まず、経過時間を計測し表示するクラスを作成します。javafx.scene.control.Labelクラス上に経過時間を表示するようにします。又、経過時間を画面に表示し続けるためにjavafx.animation.Timelineを利用してアニメーションを実装します。

アニメーションの実装ではjavafx.event.EventHandlerインターフェースを実装して実行するイベントの内容を定義し、そのイベントの実行間隔とともにTimelineクラスへ設定します。

開始/停止ボタン押下時にTimelineクラスのplay()メソッドおよび、stop()メソッドを動作させます。経過時間の計測はイベントの実行間隔をイベントが実行されるたびに加算する方法で行います。

 

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Label;
import javafx.util.Duration;

public class StopWatch extends Label {

  // 時刻表示アニメーション
  private Timeline timeline;

  // 表示内容
  private final StringProperty stringProperty = new SimpleStringProperty();

  // 表示する時間 ※初期値は0
  private Duration time = Duration.ZERO;

  // ストップウォッチが起動状態かのフラグ
  private boolean active;

  // コンストラクタ
  // インスタンス化する際に表示内容の設定と初期化を行う
  public StopWatch() {

    // 表示する内容を定義
    textProperty().bind(stringProperty);

    // 初期値を設定
    reset();
  }

  // ストップウォッチ開始/停止時
  public void action() {

    if (active) {
      // 既に起動している場合

      // アニメーションを停止
      timeline.stop();

      // 停止状態に設定
      active = false;

      // 表示内容を設定
      stringProperty.set(String.valueOf(time.toSeconds()));

    } else {

      // 起動していない場合

      // 起動状態に設定
      active = true;

      // 初回起動時
      if (timeline == null) {

        // 一定間隔で実施するイベントをEventHandlerインターフェースを実装したローカルクラスで定義
        class EventHandlerStopWatch implements EventHandler<ActionEvent> {

          public void handle(ActionEvent event) {

            // 経過時刻を取得
            Duration d = ((KeyFrame) event.getSource()).getTime();

            System.out.println(d);

            // 経過時間を加算
            time = time.add(d);

          }
        }

        // イベントのインスタンス
        EventHandlerStopWatch ehsw = new EventHandlerStopWatch();

        // アニメーションの間隔を定義(0.1秒)
        timeline = new Timeline(new KeyFrame(Duration.seconds(0.1), ehsw));

      }

      // アニメーション繰り返し回数に上限なし
      timeline.setCycleCount(Timeline.INDEFINITE);

      // アニメーションを開始
      timeline.play();

    }
  }

  // リセット
  public void reset() {

    // 表示時刻を0にする
    time = Duration.ZERO;
    stringProperty.set(String.valueOf(time.toSeconds()));
  }

  // 起動状態を返却するゲッター
  public boolean isActive() {
    return active;
  }

}

 

次にアプリケーションとなるクラスです。javafx.application.Applicationを継承し、startメソッドを実装します。javafx.stage.StageクラスオブジェクトにGUI部品をレイアウトします。

上記で作成したストップウォッチラベル、開始/停止ボタン、リセットボタンを配置します。ラベルの表示内容はストップウォッチの起動状態により変える(起動していない場合は「開始」起動中は「停止」)ようにします。

アプリケーションの起動にはApplication.launchメソッドを実行します。

 

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public final class Sample extends Application {

  public static void main(final String[] args) {

    //アプリケーションを起動します。
    Application.launch(Sample.class);

  }

  @Override
  public void start(final Stage arg0) throws Exception {

    //Stageクラスのインスタンス
    Stage stage = new Stage();

    //ストップウォッチクラスのインスタンス
    final StopWatch stopwatch = new StopWatch();

    //開始ボタン
    final Button start = new Button("開始");

 

    //起動時のイベントを定義
    start.setOnAction(e -> {

      if (stopwatch.isActive()) {

        //ストップウォッチが起動中→停止ボタンを押した場合、次に「開始」を表示する
        start.setText("開始");

      } else {

        //ストップウォッチが起動していない→開始ボタンを押した場合、次に「終了」を表示する
        start.setText("終了");
      }

      //ストップウォッチを開始
      stopwatch.action();
    });

 

    //リセットボタン
    final Button reset = new Button("リセット");

    //リセットボタン押下時のイベント
    reset.setOnAction(e -> {

      //ストップウォッチをリセット
      stopwatch.reset();
    });

    //ストップウォッチと各ボタンを横並びに配置
    stage.setScene(new Scene(new HBox(stopwatch, new HBox(start, reset))));

    //表示
    stage.show();
  }

}

実行するとアプリケーションが起動します。開始/停止およびリセットボタンで経過時間の表示を確認しましょう。

 

[PR] Javaで挫折しない学習方法を動画で公開中

監修してくれたメンター

長屋雅美

独立系SIerで7年勤務後、現在はフリーのエンジニアとして自宅をオフィスとして活動しています。
JavaやC♯、shellscriptを用いた開発を主に担当し、TechAcademyではJavaコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。