JavaFx - 更新 GUI

标签 java javafx

我只想在程序运行时更新标签。我正在阅读一些文件,我希望它显示正在阅读的文件的名称。

但是,它只使用下面的代码显示最后一个文件(基本上 GUI 在整个过程完成之前不会响应):

static Text m_status_update = new Text(); //I declared this outside the function so dont worry
m_status_update.setText("Currently reading " + file.getName());

我有大约 4-5 个文件,我只想显示名称。

看到类似的问题Displaying changing values in JavaFx Label ,最佳答案推荐如下:

Label myLabel = new Label("Start"); //I declared this outside the function so dont worry
myLabel.textProperty().bind(valueProperty);

但是 valueProperty 是一个 StringProperty,我无法将字符串转换为字符串属性。

此外,我看到了这个 Refresh label in JAVAFX ,但 OP 可以根据操作更新标签。我真的没有任何 Action 吗?

最佳答案

如果您在 FX Application 线程上运行整个过程,那么它(实际上)是用于显示 UI 的同一个线程。如果 UI 的显示和文件迭代过程都在同一个线程中运行,那么一次只能发生一个。因此,您可以阻止 UI 更新,直到该过程完成。

这是一个简单的示例,我在每次迭代之间暂停 250 毫秒(模拟读取相当大的文件)。一个按钮在 FX 应用程序线程中启动它(注意在运行时 UI 是如何无响应的——您不能在文本字段中键入)。另一个按钮使用 Task 在后台运行它,在 FX 应用程序线程上正确安排对 UI 的更新。

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class UpdateTaskDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label();
        Button runOnFXThreadButton = new Button("Update on FX Thread");
        Button runInTaskButton = new Button("Update in background Task");
        HBox buttons = new HBox(10, runOnFXThreadButton, runInTaskButton);
        buttons.setPadding(new Insets(10));
        VBox root = new VBox(10, label, buttons, new TextField());
        root.setPadding(new Insets(10));

        runOnFXThreadButton.setOnAction(event -> {
            for (int i=1; i<=10; i++) {
                label.setText("Count: "+i);
                try {
                    Thread.sleep(250);
                } catch (InterruptedException exc) {
                    throw new Error("Unexpected interruption");
                }
            }

        });

        runInTaskButton.setOnAction(event -> {
            Task<Void> task = new Task<Void>() {
                @Override 
                public Void call() throws Exception {
                    for (int i=1; i<=10; i++) {
                        updateMessage("Count: "+i);
                        Thread.sleep(250);
                    }
                    return null ;
                }
            };
            task.messageProperty().addListener((obs, oldMessage, newMessage) -> label.setText(newMessage));
            new Thread(task).start();
        });

        primaryStage.setScene(new Scene(root, 400, 225));
        primaryStage.show();
    }

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

关于JavaFx - 更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26554814/

相关文章:

java - 在运行时编辑 JavaFX CSS

JavaFx 透明舞台和静态绘制

java - 将样式表添加到 javafx 时遇到问题

java - WAV文件到FLAC不起作用

java - 汉诺塔输出

java - 在应用程序中包含 JTattoo LAF

JavaFX 窗口未立即打开

Javafx 表加载正确的行数,但加载重复的数据。我错过了什么吗?

java - RxJava 2 - 如何在错误时取消无限流并处理它?

java - 使用逗号分隔值构建字符串