gpt4 book ai didi

JavaFX:如何将 Button 属性绑定(bind)到线程状态?

转载 作者:行者123 更新时间:2023-11-30 02:25:33 24 4
gpt4 key购买 nike

我有一个 javafx 应用程序,它在单击按钮时启动一个新线程。

这是启动线程的方法:

private void startTest() {
String[] args = {};
String threadId = TestRunner.class.getSimpleName();
mainApp.setRunner(new Thread(() -> {
try {
TestRunner.main(args);
} catch (Throwable e) {
LOGGER.fatal(e.getMessage(), e);
}
}, threadId));
mainApp.getRunner().start();
}

我可以使用 setRunner()getRunner() 访问器从 mainApp 获取和设置 Thread 对象。

这就是当前正在发生的事情:

  • 我启动应用程序
  • 我点击按钮[开始]
  • 单击后,将启动一个新线程,我会将 [START] 按钮的文本更改为 [PAUSE]
  • 我知道线程将在某个时间点完成(当任务完成时)

    我想要实现的目标:

  • 我想在线程完成后/时将当前 [PAUSE] 按钮的文本更改为 [START]线程死亡。
  • 其他一些依赖于线程状态的事情

    我怎样才能做到这些?

    我目前正在研究可观察的 boolean 值,但我可以使用一些帮助来实现这一点。

    提前致谢!

  • 最佳答案

    使用Service来管理主应用程序中的后台线程(或者您当前管理runner属性的任何地方)。像这样的东西:

    public class MainApp {

    private final Service<Void> testService = new Service<Void>() {
    @Override
    protected Task<Void> createTask() {
    return new Task<Void>() {
    @Override
    protected Void call() throws Exception {
    // code to execute on background thread here:
    while (! isCancelled() ) {
    // ...
    }
    }
    }
    }
    };

    public Service<Void> getTestService() {
    return testService();
    }

    // ...
    }

    然后在您的用户界面中您需要做的就是

    Button startButton = new Button();
    startButton.textProperty().bind(Bindings.
    when(mainApp.getTestService().runningProperty()).
    then("Pause").
    otherwise("Start"));
    startButton.setOnAction(e -> {
    if (mainApp.getTestService().isRunning()) {
    mainApp.getTestService().cancel();
    } else {
    mainApp.getTestService().restart();
    }
    });

    Task documentation有大量信息和示例说明如何实现从 ServicecreateTask() 方法返回的 Task

    关于JavaFX:如何将 Button 属性绑定(bind)到线程状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45726500/

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