すずろぐ

人生大逆転を目指す、鈴木俊吾の成長日記

スポンサーリンク

JavaFX ProgressBarで進捗状況を表示するサンプルプログラム

こんばんは、すずしんです。

今日はJavaFXの簡単なプログラミングをしていました。 GUIの使い方の練習の意味も込めてProgressBarを使ってみました。

このProgressBarを使うと、ある処理の進捗状況を視覚的に把握しやすくなります。 時間がかかる処理をする際には、ProgressBarが配置してあると良いですね。 処理の終了時間の目安が分かったりしますので。

今回の記事では、私が作成してみたProgressBarの簡単なサンプルプログラムを載せておきます。 このサンプルプログラムを読めば、ProgressBarの基本的な使い方が分かるようになると思いますよ。

ProgressBar

ProgressBarは、ある作業の進捗状況を表示するのに用いられます。 ProgressBarを作成するときには以下のようにします。

ProgressBar bar = new ProgressBar();

例えば以下のようなメソッドを用いると、ProgressBarの基本的な値を設定することが可能です。

bar.setProgress(0.0);
bar.setPrefWidth(320);
bar.setPrefHeight(40);

ProgressBarの現在の値を使う際には、progressProperty()を使って他のクラスのプロパティとbindすると良いと思います。

bar.progressProperty().bind(task.progressProperty());

サンプルプログラム

今回作成したサンプルプログラムは、1から100までをカウントアップする処理の進捗状況を表示するというものです。 ボタンを押すとカウントアップ処理がスタートして、ProgressBarとLabelの表示が随時更新されていきます。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

/**
 * @author Shingo Suzuki
 */
public class ProgressBarSample extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        HBox box = new HBox(10);
        Button button = new Button("Task start");
        ProgressBar bar = new ProgressBar();
        Label text = new Label("0/100");
        
        // HBox
        box.setAlignment(Pos.CENTER);
        box.getChildren().addAll(button, bar, text);
        
        // Button
        button.setOnAction(e -> {
            Task task = getTask();
            bar.progressProperty().unbind();
            bar.progressProperty().bind(task.progressProperty());
            text.textProperty().bind(task.messageProperty());
            ExecutorService executor = Executors.newSingleThreadExecutor();
            executor.submit(task);
            task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, wse -> executor.shutdown());
        });
        
        // ProgressBar
        bar.setProgress(0);
        bar.setPrefWidth(180);
        
        // Stage
        Scene scene = new Scene(box, 360, 160);
        stage.setScene(scene);
        stage.setTitle("ProgressBar Sample");
        stage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
    
    private Task getTask() {
        return new Task() {
            @Override
            protected String call() throws Exception {
                for(int i = 1; i <= 100; i++) {
                    updateProgress(i, 100);
                    updateMessage(String.format("%d/%d", i, 100));
                    TimeUnit.MILLISECONDS.sleep(100);
                }
                return "Done";
            }
        };
    }
}

実行結果

実行結果は以下のようになります。 処理の進捗に応じてProgressBarとLabelが更新されているのが分かりますね。

JavaFX - ProgressBar