12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?