オーダーメイドコース
icon
icon

Javaでカウントダウンタイマーを作成する方法を現役エンジニアが解説【初心者向け】

初心者向けにJavaでカウントダウンタイマーを作成する方法について解説しています。ここではjavafx.animation.Timelineクラスを使ってカウントダウンタイマーを作成します。基本の設計と処理の流れをサンプルコードで確認しましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

 

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
 

なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

 

田島悠介

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

大石ゆかり

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

田島悠介

カウントダウンタイマーを作成する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

カウントダウンタイマーのプログラムの仕組み

javaFXを利用してカウントダウンタイマーを作成します。カウントダウンタイマーは、プルダウンで分数、秒数を選択しスタートボタンを押すとカウントダウンがはじまります。0分0秒となるまでか、リセットボタンが押下されるまで継続します。

 

カウントダウンタイマーに利用できるJavaのクラスなど

カウントダウンしている要素を画面に描写するにはjavafx.animation.Timelineクラスを使います。一定間隔で繰り返す処理をアニメーションとして定義することができます。今回は1秒(1000ミリ秒)間隔で画面に残り時間を表示するようにします。

 

[PR] 未経験からWebエンジニアを目指す方法とは

実際に書いてみよう

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.TilePane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Sample extends Application {

  // 画面上部ペイン
  FlowPane flowTop;

  // 画面下部ペイン
  FlowPane flowBottom;

  // 分数選択コンボボックス
  ComboBox<Integer> comboMin;

  // 分ラベル
  Label labelMin = new Label("分");

  // 秒数選択コンボボックス
  ComboBox<Integer> comboSec;

  // 秒ラベル
  Label labelSec = new Label("秒");

  // スタートボタン
  Button buttonStart = new Button("スタート");

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

  // タイマー部分 分表示ラベル
  Label TimerMin = new Label();

  // タイマー部分 分ラベル
  Label labelTimerMin = new Label("分");

  // タイマー部分 秒表示ラベル
  Label TimerSec = new Label();

  // タイマー部分 秒ラベル
  Label labelTimerSec = new Label("秒");

  // タイマー部分 終了ラベル
  Label labelTimerFinish = new Label("");

  //アニメーションクラス
  Timeline timer;

  public static void main(String[] args) {
    launch();
  }

  @SuppressWarnings("static-access")
  public void start(Stage stage) {

    ObservableList<Integer> data = FXCollections.observableArrayList();

    for (int i = 0; i < 60; i++) {
      data.add(i, i);
    }

    // 分数選択コンボボックス
    comboMin = new ComboBox<Integer>(data);
    comboMin.setOnAction((ActionEvent) -> {

      TimerMin.setText(String.format("%02d", comboMin.getValue()));
    });
    comboMin.setValue(0);

    // 秒数選択コンボボックス
    comboSec = new ComboBox<Integer>(data);
    comboSec.setOnAction((ActionEvent) -> {

      TimerSec.setText(String.format("%02d", comboSec.getValue()));

    });

    reset();

    // 画面上部ペインを作成
    flowTop = new FlowPane();
    flowTop.setPadding(new Insets(10, 10, 10, 10));
    flowTop.setVgap(1);
    flowTop.setHgap(1);

    // 画面上部の要素をペインへ配置
    flowTop.getChildren().add(comboMin);
    flowTop.getChildren().add(labelMin);
    flowTop.getChildren().add(comboSec);
    flowTop.getChildren().add(labelSec);
    flowTop.getChildren().add(buttonStart);
    flowTop.getChildren().add(buttonReset);

    // 画面下部ペインを作成
    flowBottom = new FlowPane();

    TimerMin.setFont(new Font(50));
    TimerMin.setText("00");

    TimerSec.setFont(new Font(50));
    TimerSec.setText("00");

    // 画面下部要素を追加
    flowBottom.getChildren().add(TimerMin);
    flowBottom.getChildren().add(labelTimerMin);
    flowBottom.getChildren().add(TimerSec);
    flowBottom.getChildren().add(labelTimerSec);
    flowBottom.getChildren().add(labelTimerFinish);

    buttonStart.setOnAction((ActionEvent) -> {

      buttonStart.setDisable(true);
      buttonReset.setDisable(false);

      // アニメーションの定義(1000ミリ秒間隔で描写する)
      timer = new Timeline(new KeyFrame(Duration.millis(1000), new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {

          // 秒数、分数の繰り下げ
          if (TimerSec.getText().equals("00")) {

            if (TimerMin.getText().equals("00")) {

              // 全て0になったら終了ラベルを表示
              labelTimerFinish.setText("   終了!!");

            } else {
              TimerSec.setText("59");
              TimerMin.setText(String.format("%02d", Integer.parseInt(TimerMin.getText()) - 1));
            }

          } else {
            TimerSec.setText(String.format("%02d", Integer.parseInt(TimerSec.getText()) - 1));
          }

        }
      }));

      // アニメーションを無限に繰り返す
      timer.setCycleCount(Timeline.INDEFINITE);

      // アニメーション開始
      timer.play();
    });

    // リセットボタンが押下された場合
    buttonReset.setOnAction((ActionEvent) -> {

      // タイマーしょ終了する
      timer.stop();

      // 初期化処理を行う
      reset();
    });

    // ペインに画面上部、下部のペインを追加
    TilePane tile = new TilePane(Orientation.VERTICAL);
    tile.getChildren().add(flowTop);
    tile.getChildren().add(flowBottom);

    // 画面にスタック・ペインを追加
    stage.setScene(new Scene(tile, 300, 200));

    // 画面の表示
    stage.show();

  }

  void reset() {

    // リセットボタンを非活性化
    buttonReset.setDisable(true);

    // スタートボタンを活性化
    buttonStart.setDisable(false);

    // プルダウンの値を初期化
    comboMin.setValue(0);
    comboSec.setValue(0);

    // タイマー部分の表示を初期化
    TimerSec.setText("00");
    TimerMin.setText("00");

    // 終了ラベルを初期化
    labelTimerFinish.setText("");

  }

}

 

監修してくれたメンター

長屋雅美

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

 

大石ゆかり

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

田島悠介

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

大石ゆかり

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

TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。