gpt4 book ai didi

javafx - 从 JavaFX 中的任务 API 调用的嵌套函数更新标签

转载 作者:行者123 更新时间:2023-12-04 02:36:59 26 4
gpt4 key购买 nike

我正在使用这个类执行一些后台任务

class Download extends Task{
protected Object call() throws Exception {
try {
updateMessage("Establishing Connection");
DownloadHelper downloadHelper = new DownloadHelper();
downloadHelper.performTask();
return null;
} catch (IOException | ParseException ex) {
logger.error(ExceptionUtils.getStackTrace(ex));
throw ex;
}
}
}

此任务依次调用 DownloadHelper 来执行某些任务。

class DownloadHelper{
public DownloadHelper(){
}

public void performTask(){
----
----
}
}

有没有办法从 DownloadHelper 类更新任务 API (updateMessage()) 的状态消息?

最佳答案

权宜之计是将对Download 任务的引用作为参数传递给DownloadHelper 构造函数。为了最小化耦合,您可以改为将对 updateMessage() 的实现的引用作为 Consumer 类型的参数传递, “接受单个输入参数且不返回任何结果的操作。”

DownloadHelper helper = new DownloadHelper(this::updateMessage);

然后,您的助手的 performTask() 实现可以根据需要请求 updater accept() 消息。

Consumer<String> updater;

public DownloadHelper(Consumer<String> updater) {
this.updater = updater;
}

public void performTask() {
updater.accept("Helper message");
}

相关例子可见here .

image

import java.util.function.Consumer;
import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
* @see https://stackoverflow.com/q/45708923/230513
*/
public class MessageTest extends Application {

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("MessageTest");
StackPane root = new StackPane();
Label label = new Label();
root.getChildren().add(label);
Scene scene = new Scene(root, 320, 120);
primaryStage.setScene(scene);
primaryStage.show();
Download task = new Download();
task.messageProperty().addListener((Observable o) -> {
label.setText(task.getMessage());
});
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();
}

private static class Download extends Task<String> {

@Override
protected String call() throws Exception {
updateMessage("Establishing connection");
DownloadHelper helper = new DownloadHelper(this::updateMessage);
helper.performTask();
return "MessageTest";
}

@Override
protected void updateMessage(String message) {
super.updateMessage(message);
}
}

private static class DownloadHelper {

Consumer<String> updater;

public DownloadHelper(Consumer<String> updater) {
this.updater = updater;
}

public void performTask() {
updater.accept("Helper message");
}
}

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

}

关于javafx - 从 JavaFX 中的任务 API 调用的嵌套函数更新标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45708923/

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