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 行目をコメントアウトすると、処理の進捗度を示さない表示になります。
参考サイト
- Using JavaFX UI Controls: Progress Bar and Progress Indicator | JavaFX 2 Tutorials and Documentation
- ProgressBar (JavaFX 8)




0 件のコメント:
コメントを投稿