在执行外部进程时更新我的​​ JavaFX 应用程序的视图

问题描述

我在执行外部进程时更新我的​​ JavaFX 应用程序的视图时遇到问题。在下面的代码中,在while中,我放了一些代码显示已执行进程的状态。

System.out.println(line); 完美运行,我在控制台中看到了进程的输出

但是 tStatus.setText(line); 没有效果

refreshListFilesDestination() 都不是

有人知道我做错了什么吗?

谢谢

ProcessBuilder builder = new ProcessBuilder(
      "cmd.exe","/c","java -jar \"c:\\Program Files (x86)\\jsignpdf\\jsignpdf.jar\" -kst WINDOWS-MY " + stringFilesList + " -d " + fieldDirectoryDestination.getText() + " -V");

builder.redirectErrorStream(true);
try {
    Process p = builder.start();
    BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while (true) {
        line = r.readLine();
        if (line == null) {
            break;
        }
        System.out.println(line); // this work fine I see all the outpout comming in the console
        tStatus.setText(line); // Don't work,except at the very end
        refreshListFilesDestination(); // This is a method who refresh a list of files,it Don't work
    }
} catch (Exception e1) {
    tStatus.setText("Command return an error");
}

解决方法

JavaFx 不知道您所做的更改。最好绑定,类似这样:

tStatus.textProperty().bind(line)

在您的情况下,可能需要更改文本字段的变量(使其在您定义 textfield 的类中并使其可设置),那么当您只使 {{1 }}。

,

改变

    tStatus.setText(line); 

    Platform.runLater(() -> tStatus.setText(line));

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            tStatus.setText(line);
        }
    });    

see more about method runLater()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...