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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 件のコメント:
コメントを投稿