![](/img/trans.png)
[英]javaFX: How to create a Live ListView and add a ChangeListener to it
[英]How to add a Java ChangeListener to a method return
我有一個帶有“中止”按鈕的任務控制GUI,該按鈕調用了一些取消代碼(工作正常)。 但是,我想將按鈕的禁用狀態同步到任務是否正在運行,因此如果任務未運行,則禁用該選項。 我可以通過其Boolean Future.isDone()方法檢查任務的狀態,但是我想讓JavaFX通過bound屬性自動管理狀態。 但是,我無法弄清楚如何建立綁定,也無法在方法上設置ChangeListener。 誰能建議如何最好地完成?
編輯 :我認為這個問題最終歸結為“如何包裝Future.isDone()以使其可觀察?”
指導非常感謝。
使用Task
。 您可以觀察state
屬性來修改Button
的disabled屬性:
private ExecutorService service;
@Override
public void stop() throws Exception {
service.shutdownNow();
}
@Override
public void init() throws Exception {
service = Executors.newSingleThreadScheduledExecutor();
// service = new ThreadPoolExecutor(1, 2, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
}
@Override
public void start(Stage primaryStage) {
Button startButton = new Button("Start");
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
Thread.sleep(5000);
System.out.println("task finished");
return null;
}
};
Button cancelButton = new Button("cancel");
cancelButton.setOnAction(evt -> task.cancel());
cancelButton.setDisable(true); // button disabled before submitting task
startButton.setOnAction((ActionEvent event) -> {
startButton.setDisable(true);
// cancel Button enabled until task is succeeded/failed/was cancelled
cancelButton.disableProperty().bind(Bindings.createBooleanBinding(() -> {
switch (task.getState()) {
case CANCELLED:
case FAILED:
case SUCCEEDED:
return true;
default:
return false;
}
}, task.stateProperty()));
// simulate some work to be done by the service
service.submit(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
}
System.out.println("runnable finished");
});
service.submit(task);
});
// show state as text
Text text = new Text();
text.textProperty().bind(task.stateProperty().asString());
VBox root = new VBox(10, startButton, cancelButton, text);
Scene scene = new Scene(root, 300, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
解決了,還是足夠好。 綁定到SimpleBooleanProperty的GUI控件。 構造函數啟動一個后台線程Runnable, isDone()
線程以半秒的睡眠在無限循環中輪詢isDone()
並更新綁定的SBP。 再次感謝fabian,為我指出了一個適當的解決方案,以供將來參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.