2012-12-16
JavaFXでTaskの進捗率をProgressBarに表示
JavaFXで「Start」ボタンをクリックしたら非同期のTaskを実行して、その進捗率をProgressBarに表示する画面を作成
- 起動直後の画面
- startボタンをクリック、2つのTaskがそれぞれ動作している画面(ProgressBarがそれぞれ動く、
でも右端に進捗率の文言を設定しているつもりが表示されない?)
- bindの実装を修正して右端に文言が表示されるようになりました
- Task終了後の画面
- 実装はこんな感じ(修正しました)
package progresssample; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import javafx.application.Application; import javafx.concurrent.Task; import javafx.concurrent.WorkerStateEvent; import javafx.event.ActionEvent; import javafx.event.Event; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ProgressBar; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; public class ProgressSample extends Application { @Override public void start(Stage primaryStage) { VBox vBox = new VBox(); vBox.setSpacing(5); vBox.setAlignment(Pos.CENTER); final Scene scene = new Scene(vBox, 300, 250); // ★1行目 HBox hBox1 = new HBox(); hBox1.setSpacing(5); Text title1 = new Text("Task1"); Button btn1 = new Button("start"); final ProgressBar bar1 = new ProgressBar(0); final Text text1 = new Text("ready"); hBox1.setAlignment(Pos.CENTER); hBox1.getChildren().addAll(title1, btn1, bar1, text1); btn1.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { final Task<String> task1 = getTask1(); // ★1Taskを作成 bar1.progressProperty().unbind(); bar1.progressProperty().bind(task1.progressProperty()); // ★2バインド指定 text1.textProperty().bind(task1.messageProperty()); // ★5txtのバインド指定 final ExecutorService exe = Executors.newSingleThreadExecutor(); exe.submit(task1); // ★3Task実行開始 task1.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { exe.shutdown(); // ★4 } }); } }); // ★2行目 HBox hBox2 = new HBox(); hBox2.setSpacing(5); Text title2 = new Text("Task2"); Button btn2 = new Button("start"); final ProgressBar bar2 = new ProgressBar(0); final Text text2 = new Text("ready"); hBox2.setAlignment(Pos.CENTER); hBox2.getChildren().addAll(title2, btn2, bar2, text2); btn2.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { final Task<String> task2 = getTask2(); bar2.progressProperty().unbind(); bar2.progressProperty().bind(task2.progressProperty()); text2.textProperty().bind(task2.messageProperty()); final ExecutorService exe = Executors.newSingleThreadExecutor(); exe.submit(task2); task2.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { exe.shutdown(); } }); } }); vBox.getChildren().add(hBox1); vBox.getChildren().add(hBox2); primaryStage.setTitle("Progress Smaple"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } private Task<String> getTask1() { return new Task<String>() { @Override protected String call() throws Exception { updateMessage("start task1"); int i; for (i = 1; i <= 10; i++) { updateProgress(i, 10); // ★1-1ここでTaskのprogressを設定 TimeUnit.SECONDS.sleep(1); updateMessage(String.format("running %d/%d", i, 10)); // ★1-2ここでTaskのmessageを設定 } updateMessage("task1 done"); return "Done"; } }; } private Task<String> getTask2() { return new Task<String>() { @Override protected String call() throws Exception { updateMessage("start task2"); int i; for (i = 1; i <= 20; i++) { updateProgress(i, 20); TimeUnit.SECONDS.sleep(1); updateMessage(String.format("running %d/%d", i, 20)); } updateMessage("task2 done"); return "Done"; } }; } }
★5のTaskのMessageを取得して、画面右のTextに設定しているが画面に表示されない?
textのbind指定もpropertyを使用するようです。
text1.textProperty().bind(task1.messageProperty()); // ★5txtのバインド指定
次はこれをLambda式で実装しよう!
トラックバック - http://d.hatena.ne.jp/tomoTaka/20121216/1355632882
リンク元
- 26 https://www.google.co.jp/
- 8 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&ved=0CDkQFjAB&url=http://d.hatena.ne.jp/tomoTaka/20120622/1340381565&ei=HXjOUKP-Ne2YmQXe3oCgAg&usg=AFQjCNHMatsIkV0C8nkKozdyYX-C7uaR_Q&bvm=bv.1355325884,d.dGY
- 7 http://t.co/LDpDXQd2
- 6 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=10&ved=0CJQBEBYwCQ&url=http://d.hatena.ne.jp/tomoTaka/?of=3&ei=zu7NUO6eOc2KmQWjtICQCA&usg=AFQjCNF1-cOxDa9jaRE3td7YCAea6t-jfw&sig2=Zt19mjufS7L5z5eWFJfdDg&bvm=bv.1355325884,d.dGY
- 6 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&ved=0CEIQFjAC&url=http://d.hatena.ne.jp/tomoTaka/20120311/1331446628&ei=3vHNUKK2Ko3OmgWTpYCQCA&usg=AFQjCNGdiwhg27rBpZY3fV4KYN_hM6WdTw&bvm=bv.1355325884,d.dGY
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=5&ved=0CHEQFjAE&url=http://d.hatena.ne.jp/tomoTaka/20120602/1338598873&ei=O7bNUMWaI6PJmQWAsoE4&usg=AFQjCNGBIkj7oQbZUrOH06fKlCVzmtG7iw&sig2=wNllefUNew7iIG6QBLoI1Q&bvm=bv.13553
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEUQFjAD&url=http://d.hatena.ne.jp/tomoTaka/20121117/1353114625&ei=q_fNUPz8Bo7PmAWDi4DYBA&usg=AFQjCNEvVeNjThKpQAiDynJGwJITsJCqiQ&bvm=bv.1355325884,d.dGY
- 3 http://search.minakoe.jp/rsss/rsss.asp?pgsz=100&qry=java¬wit=1&twit=0&debug=1&multi=1
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=objective-c データ型&source=web&cd=4&ved=0CEYQFjAD&url=http://d.hatena.ne.jp/tomoTaka/20120211/1328913605&ei=l8DPUPmzNOKNmQWr5IGABQ&usg=AFQjCNH6oP23fivTH0kHAMW3ktQyNcMvzQ&b
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=@interface class&source=web&cd=4&ved=0CEUQFjAD&url=http://d.hatena.ne.jp/tomoTaka/20120212/1329003936&ei=dKPOUKjpKYTkmAW0hYCQBQ&usg=AFQjCNFCd90Xdl_zGOnejHagiksu5UA3kQ



