LoginSignup
12
13

More than 5 years have passed since last update.

JavaFXでバックグラウンドスレッドの実行

Posted at

JavaFXで重い処理(時間がかかる処理)を実施する場合、
バックグラウンドスレッドで処理をしないと処理が終わるまで画面が更新されない。
(画面の操作もできない)

バックグラウンドスレッドで処理をするにはServiceクラスとTaskクラスを使用する。

以下がServiceクラスとTaskクラスを使用したバックグラウンドスレッドの処理の
サンプルになる。内容としては、ボタン押下して1秒後にテキストフィールドに
メッセージを出力する。

ServiceMain.java
public class ServiceMain extends Application{
    final private static XService service = new XService();

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

    @Override
    public void start(Stage stage) throws Exception {
        Group root = new Group();
        stage.setScene(new Scene(root));

        //テキストエリア
        TextField field = new TextField("");
        field.textProperty().bind(service.messageProperty());

        //ボタン
        Button btn = new Button("ボタンです。");
        btn.setOnMouseClicked(new EventHandler(){
            @Override
            public void handle(Event event) {
                service.restart();
            }
        });

        //レイアウト
        VBox vBox = new VBox();
        vBox.getChildren().addAll(btn, field);

        root.getChildren().add(vBox);
        stage.show();
    }
}

・サービスを生成し、ボタン押下でサービスをスタート(リスタート)する。

XService.java
public class XService extends Service<Void>{

    @Override
    protected Task<Void> createTask() {
        return new XTask();
    }

}

・Serviceクラスをextendsする。
・createTaskメソッドをOverrideし、Taskクラスを生成してリターンする。

XTask.java
public class XTask extends Task<Void>{
    @Override
    protected Void call() throws Exception {
        Thread.sleep(1000);

        updateMessage("OK");

        return null;
    }

}

・Taskクラスをextendsする。
・callメソッドをOverrideし、このメソッド内に重い処理(時間がかかる処理)を
 実装する。サンプルでは、1秒間スリープした後に文字列"OK"を設定。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13