2015-03-15

ProgressBar と Thread

bitWalk's: ProgressIndicator と Thread を読み直していたら、自分で書いた記事にも関わらずコードが実に判りにくい。これは SWT のせいではなく、自分のプログラミングセンスの無さに違いないとガッカリします。

今回は、気を取り直して、JavaFX で同じようなことを確認するプログラムを紹介します。プログラムの判りやすさが少しでも改善していることを祈って…。なお、今回は二つのクラスに分けました。

動作環境は次の通りです。

  • OS: WIndows 8.1 (64bit)
  • Java: Java SE 1.8.0_40-b25
  • IDE: NetBeans IDE 8.0.2
リスト:ProgressBarTest.java 
package progressbartest;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ProgressBarTest extends Application {

    ProgressBar pb = new ProgressBar(0);

    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("ProgressBarTest");

        Button bt = new Button("処理開始");
        bt.setOnAction((ActionEvent e) -> {
            startWork();
        });

        VBox vb = new VBox();
        vb.setSpacing(0);
        vb.setAlignment(Pos.CENTER);
        vb.getChildren().addAll(bt, pb);

        bt.prefWidthProperty().bind(vb.widthProperty());
        bt.prefHeightProperty().bind(vb.heightProperty());
        pb.prefWidthProperty().bind(vb.widthProperty());

        scene.setRoot(vb);
        stage.show();
    }

    void startWork() {
        DummyTask task = new DummyTask();
        Thread th = new Thread(task);
        pb.progressProperty().bind(task.progressProperty());

        th.setDaemon(true);
        th.start();
    }

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

スレッドを処理するダミーの処理を以下に示します。

リスト:DummyTask.java 
package progressbartest;

import javafx.concurrent.Task;

class DummyTask extends Task<Void> {

    @Override
    protected Void call() throws Exception {
        updateProgress(-1, 1);

        // dummy task
        long sleepTime = 5000; // milliseconds
        long startTime = System.currentTimeMillis();
        long endTime = startTime + sleepTime;

        while (System.currentTimeMillis() < endTime) {
            if (isCancelled()) {
                break;
            }
            updateProgress(System.currentTimeMillis() - startTime, sleepTime);
        }

        updateProgress(1, 1);
        return null;
    }
}

実行例を以下に示します。

DummyTask.java の 20 行目をコメントアウトすると、処理の進捗度を示さない表示になります。

参考サイト

  1. Using JavaFX UI Controls: Progress Bar and Progress Indicator | JavaFX 2 Tutorials and Documentation
  2. ProgressBar (JavaFX 8)

 

0 件のコメント: