当前位置: 首页 > 知识库问答 >
问题:

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

聂煜
2023-03-14
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;
        }
    }
}
class DownloadHelper{
    public DownloadHelper(){
    }

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

是否有一种方法可以从DownloadHelper类更新任务API(updateMessage())的状态消息。?

共有1个答案

梁丘霖
2023-03-14

方便的方法是将对download任务的引用作为参数传递给downloadhelper构造函数。为了最小化耦合,您可以将updateMessage()实现的引用作为consumer类型的参数传递,“一个接受单个输入参数但不返回结果的操作”。

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

然后,您的助手的PerformTask()实现可以要求更新程序根据需要Accept()消息。

Consumer<String> updater;

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

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

这里有一个相关的例子。

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);
    }

}
 类似资料:
  • 这是我的架构:

  • 问题内容: 我有以下代码: 有什么方法可以在函数外部调用函数?我试过调用,但我认为它仅在父函数内部可见。 问题答案:

  • 问题内容: 我有一个方法,我已经分解成一些较小的嵌套函数来分解代码库: 有没有一种方法可以单独运行其中一个嵌套函数。例如: 编辑: 我正在尝试在使用pyramid_breaker构建的Web服务器上设置缓存 这是我的理解可能不准确: 现在我有这个原因是因为装饰器用来创建缓存键的名称空间是从函数和争论中产生的。因此,您不能仅将装饰器放在getThis上,因为请求变量是唯一的,并且缓存是无用的。所以我

  • 问题内容: 我有以下mongodb文件结构: 我已经能够使用$ elemMatch来更新操作中的字段,但是当我尝试对参数执行相同的操作(修改)时,它似乎不起作用。我想知道我应该尝试哪种其他方法,以便能够成功更新特定参数中的字段(通过其pid查找)。 我当前拥有但不起作用的更新代码如下所示: 问题答案: MongoDB 3.6及更高版本 MongoDB3.6及更高版本提供了一项新功能,该功能允许您使

  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!