gpt4 book ai didi

java - 如何将 Java ChangeListener 添加到方法返回

转载 作者:行者123 更新时间:2023-12-02 11:48:56 24 4
gpt4 key购买 nike

我有一个任务控制 GUI,带有一个“中止”按钮,可以调用一些取消代码(工作正常)。但是,我想将按钮的禁用状态与任务是否正在运行同步,以便在任务未运行时禁用该选项。我可以通过 Boolean Future.isDone() 方法检查任务的状态,但我希望 JavaFX 通过绑定(bind)属性自动管理状态。但我不知道如何建立绑定(bind),或在方法上设置 ChangeListener。谁能建议如何最好地完成任务?

编辑:我认为这个问题最终可以归结为“如何包装 Future.isDone() 使其成为 Observable?”

非常感谢指导。

最佳答案

使用任务。您可以观察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();
}

关于java - 如何将 Java ChangeListener 添加到方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com