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"を設定。