gpt4 book ai didi

JavaFX:在单独的非 Controller 类中更新 UI

转载 作者:行者123 更新时间:2023-12-01 21:09:06 25 4
gpt4 key购买 nike

我有一个 JavaFX 程序,它启动由单独的类执行的任务。我想将该任务的进度状态输出到 Label UI 中的元素。我无法让它发挥作用。这是我的代码:

Main.java:

public class Main extends Application {
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("ui.fxml"));
primaryStage.setTitle("Data collector");
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}

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

Controller.java:

我要更新的标签是通过全局删除 @FXML public Label label = new Label(); 创建的。通过 new Thread(new Task<Void>() { ... }).start(); 创建一个新线程运行collect_data方法来自TaskRunTaskRun类说明如下:

TaskRun.java:

class TaskRun {
private Controller ui;

TaskRun() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("ui.fxml"));
ui = loader.getController();
}

void collect_data() {
for (int i = 0; i < 100; i++) {
// do stuff...
send_progress_to_ui(((float) i / (float)) * 100);
}
}

void send_progress_to_ui(float percent) {
new Thread(new Task<Void>() {
@Override
protected Void call() throws Exception {
Platform.runLater(() -> ui.label.setText(Float.toString(percent_complete) + "%"));

return null;
}
}).start();
}

}

我得到一个NullPointerException上线Platform.runLater(...)

很明显,这个方法行不通。如何通过这个非 Controller 类更新UI TaskRun

最佳答案

您的设计对于您在这里尝试做的事情并没有太大帮助。您的类应该实现该任务,而不是完全隐藏任务并创建一个线程来运行它的类(这确实不灵活:如果您想将任务提交给现有的 Executor 怎么办?) 。然后你可以更新任务的进度,这是一个可观察的属性:

class TaskRun extends Task<Void> {

@Override
protected Void call() {
for (int i = 0; i < 100; i++) {
// do stuff...
updateProgress(i, 100);
}
return null ;
}

}

现在在你的 Controller 中你可以这样做:

TaskRun task = new TaskRun();
task.progressProperty().addListener((obs, oldProgress, newProgress) ->
label.setText(String.format("%.2f percent complete", newProgress.doubleValue()*100)));
new Thread(task).start();

或者,使用绑定(bind)而不是监听器:

label.textProperty().bind(task.progressProperty().asString("%.2f percent complete"));

这消除了所有可怕的耦合,因为现在 TaskRun 不需要了解有关 Controller 类的任何信息。

关于JavaFX:在单独的非 Controller 类中更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41601774/

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