如何在不丢失流程或冻结应用程序的情况下在JavaFX中实时更新textarea(控制台)

UKK

我是新来的JFX,为此我感到很挣扎。我正在尝试运行一个简单的模拟,该模拟必须将输出(system.out和system.err)打印到textarea。

 public class ConsoleController {
    @FXML
    public TextArea consoleLogscreen;

    private class Console extends OutputStream {

        @Override
        public void write(int b) throws IOException {
            consoleLogscreen.appendText(String.valueOf((char) b));
        }
    }

    @FXML
    public void initialize() throws IOException {
        Console console = new Console();
        PrintStream ps = new PrintStream(console, true);
        System.setOut(ps);
        System.setErr(ps);
        System.err.flush();
        System.out.flush();
    }
}

SimulationController:

 public class SimulationController {
    @FXML
    private Button homebutton;
    @FXML
    private Button abortbutton;
    private volatile Service<Void> backgroundThread;
    private volatile Thread t;
    private volatile Simulate sim;
    @FXML
    public void initialize() {
        sim = new Simulate();
        t = new Thread(sim);
        backgroundThread = new Service<Void>() {
            @Override
            protected Task<Void> createTask() {
                return new Task<Void>() {
                    @Override
                    protected Void call() throws Exception {
                        t.run();
                        return null;
                    }
                };
            }
        };
        backgroundThread.setOnCancelled(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent event) {
                t.interrupt();
                sim.shutDown(true);
            }
        });
        backgroundThread.restart();
        abortbutton.setDisable(false);
        homebutton.setDisable(true);
    }
    @FXML
    void onAbortClicked(ActionEvent event) throws IOException {
        if (event.getSource() == abortbutton) {
            backgroundThread.cancel();
        }
    }
    @FXML
    void onHomeClicked(ActionEvent event) throws IOException {
        if (event.getSource() == homebutton) {
            Utility.getHome((Stage) homebutton.getScene().getWindow());
        }
    }
}

Simulation.fxml:

<Pane prefHeight="500.0" prefWidth="750.0"xmlns="http://javafx.com/javafx/8"      xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.jfxabstract.view.SimulationController">
   <children>
      <Button fx:id="abortbutton" alignment="CENTER" contentDisplay="CENTER" layoutX="250.0" layoutY="430.0" mnemonicParsing="false" onAction="#onAbortClicked" styleClass="custombutton" text="Abort" textAlignment="CENTER" />
      <Button fx:id="homebutton" alignment="CENTER" contentDisplay="CENTER" layoutX="450.0" layoutY="430.0" mnemonicParsing="false" onAction="#onHomeClicked" styleClass="custombutton" text="Home" textAlignment="CENTER" />
      <fx:include source="Console.fxml" />
   </children>
</Pane>

我正在使用javafx.concurrent.service运行我的任务,但是应用程序冻结,并且打印输出不是实时的。

谁能建议我可能出了问题。

提前致谢。

更新:

run方法从数据库检索数据,并通过调用同一类中的其他方法来运行很少的验证。对于简单的抽象应用程序,我正在使用它

public void run() {
    long i = 1;
    while (i < 90) {
        double k = Math.sqrt(Math.pow(i, 2) / Math.sqrt(i));
        System.out.println("i: " + i + " Count: " + k);
        if (!shutdown) {
            break;
        }
        i++;
    }
}
菲利普·伯纳德斯

在此示例中,我编写了代码以获取System.out.println并进行实时更新

/**
 * 
 * @param str
 */
public void appendText(String str) {

    results.append(str);

    updated = true;
}

/**
 * 
 */
public void setupConsoleOutput() {

    backgroundThread = new Service<String>() {

        protected Task<String> createTask() {

            return new Task<String>() {

                protected String call() throws Exception {

                    while (true) {

                        if (isCancelled()) {

                            break;
                        }

                        if (updated) {

                            updateValue(results.toString());

                            updated = false;

                            Platform.runLater(() -> {

                                consoleOutput.setScrollTop(Double.MAX_VALUE);
                            });
                        }

                        if (exported) {

                            consoleOutput.setScrollTop(Double.MAX_VALUE);

                            exported = false;
                        }

                        Thread.sleep(100);
                    }

                    return results.toString();
                }
            };
        }
    };

    consoleOutput.textProperty().bind(backgroundThread.valueProperty());

    backgroundThread.start();

    backgroundThread.setOnCancelled(new EventHandler<WorkerStateEvent>() {

        public void handle(WorkerStateEvent event) {

        }
    });

    backgroundThread.restart();

    OutputStream out = new OutputStream() {

        @Override
        public void write(int b) throws IOException {

            appendText(String.valueOf((char) b));
        }
    };

    PrintStream ps = new PrintStream(out, true);

    System.setOut(ps);

    System.setErr(ps);
}

为我工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法在不选择它的情况下在visual studio的控制台应用程序中执行命令?

来自分类Dev

如何在不冻结应用程序的情况下在 C# 桌面应用程序中快速处理多个文件

来自分类Dev

如何在不覆盖当前数据的情况下将数据写入 C# 控制台应用程序中的文本文件

来自分类Dev

如何在没有python控制台的情况下运行tkinter应用程序

来自分类Dev

如何在没有控制台的情况下创建gui应用程序?

来自分类Dev

如何在不丢失会话的情况下更新ASP Net Webform或MVC应用程序?

来自分类Dev

如何在没有控制台的情况下在WebSphere中重置“父优先”?

来自分类Dev

如何在不重新启动应用程序的情况下收回Java的控制台?

来自分类Dev

如何在不显示弹出控制台的情况下执行Java应用程序(.exe / .jar / .bat)?

来自分类Dev

如何在没有 VS 的情况下使 Mac OS 上的 VS 控制台应用程序可运行?

来自分类Dev

如何在不影响控制台应用程序中当前用户输入(System.in)的情况下进行 System.out 调用?

来自分类Dev

如何在不执行Spring的情况下在生产中运行Ruby on Rails控制台?

来自分类Dev

如何在不破坏 Rust 工具链的情况下在 XCode 中测试 iOS 应用程序?

来自分类Dev

如何在不滚动的情况下在移动Web应用程序上启动网页

来自分类Dev

如何在不使用 geth 控制台的情况下在现有仲裁网络中添加新对等点?

来自分类Dev

控制台应用程序在单击鼠标时冻结

来自分类Dev

控制台应用程序在单击鼠标时冻结

来自分类Dev

如何在node.js控制台应用程序中应用模块模式?

来自分类Dev

如何在不使用webView的情况下在android应用程序中显示Web内容

来自分类Dev

如何在不安装Ubuntu的情况下在Unity中测试应用程序?

来自分类Dev

如何在程序类(控制台应用程序)中访问变量

来自分类Dev

如何在C#中的控制台应用程序中激活代码的不同部分

来自分类Dev

Qt如何在Windows中的非控制台应用程序中使用main()?

来自分类Dev

如何在Symfony2控制台应用程序中添加辅助输出?

来自分类Dev

如何在C ++中从控制台应用程序显示MFC对话框?

来自分类Dev

如何在Windows Form应用程序中嵌入控制台?

来自分类Dev

如何在Elastic Beanstalk应用程序中监视控制台输出(stdout)?

来自分类Dev

如何在Xamarin.iOS自己的应用程序中捕获控制台日志输出?

来自分类Dev

如何在控制台应用程序中设置默认连接字符串?

Related 相关文章

  1. 1

    有没有办法在不选择它的情况下在visual studio的控制台应用程序中执行命令?

  2. 2

    如何在不冻结应用程序的情况下在 C# 桌面应用程序中快速处理多个文件

  3. 3

    如何在不覆盖当前数据的情况下将数据写入 C# 控制台应用程序中的文本文件

  4. 4

    如何在没有python控制台的情况下运行tkinter应用程序

  5. 5

    如何在没有控制台的情况下创建gui应用程序?

  6. 6

    如何在不丢失会话的情况下更新ASP Net Webform或MVC应用程序?

  7. 7

    如何在没有控制台的情况下在WebSphere中重置“父优先”?

  8. 8

    如何在不重新启动应用程序的情况下收回Java的控制台?

  9. 9

    如何在不显示弹出控制台的情况下执行Java应用程序(.exe / .jar / .bat)?

  10. 10

    如何在没有 VS 的情况下使 Mac OS 上的 VS 控制台应用程序可运行?

  11. 11

    如何在不影响控制台应用程序中当前用户输入(System.in)的情况下进行 System.out 调用?

  12. 12

    如何在不执行Spring的情况下在生产中运行Ruby on Rails控制台?

  13. 13

    如何在不破坏 Rust 工具链的情况下在 XCode 中测试 iOS 应用程序?

  14. 14

    如何在不滚动的情况下在移动Web应用程序上启动网页

  15. 15

    如何在不使用 geth 控制台的情况下在现有仲裁网络中添加新对等点?

  16. 16

    控制台应用程序在单击鼠标时冻结

  17. 17

    控制台应用程序在单击鼠标时冻结

  18. 18

    如何在node.js控制台应用程序中应用模块模式?

  19. 19

    如何在不使用webView的情况下在android应用程序中显示Web内容

  20. 20

    如何在不安装Ubuntu的情况下在Unity中测试应用程序?

  21. 21

    如何在程序类(控制台应用程序)中访问变量

  22. 22

    如何在C#中的控制台应用程序中激活代码的不同部分

  23. 23

    Qt如何在Windows中的非控制台应用程序中使用main()?

  24. 24

    如何在Symfony2控制台应用程序中添加辅助输出?

  25. 25

    如何在C ++中从控制台应用程序显示MFC对话框?

  26. 26

    如何在Windows Form应用程序中嵌入控制台?

  27. 27

    如何在Elastic Beanstalk应用程序中监视控制台输出(stdout)?

  28. 28

    如何在Xamarin.iOS自己的应用程序中捕获控制台日志输出?

  29. 29

    如何在控制台应用程序中设置默认连接字符串?

热门标签

归档