java - 将进程输入流数据写入 GUI

标签 java user-interface swt inputstream

我在我的 GUI 的 Java 代码中使用 SWT,并执行一个用 python 编写的代码的进程。 我使用进程输入流来捕获进程上的打印并将它们立即写入我的 GUI。

我的代码:

    in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
        printToTerminal(line);
    }

和 printToTerminal 函数:

protected void printToTerminal(String text) {

        terminal.append(text + "\n");
        terminal.redraw();
        terminal.update();
    }

终端是一个文本对象,我想附加文本,然后使用重绘和更新以便立即向用户显示该行。 我的问题是我的 GUI 被卡住了,因为 while 循环完成了工作并获取了线路,但我似乎无法找到在不卡住我的 GUI 的情况下获取线路的解决方案。 我尝试使用 display.async 函数并在其中包含 while 循环,但它仍然不起作用,我的 GUI 卡住了。

有没有办法获取我的进程的输入流并将其打印到我的 GUI 而不会卡住?

感谢您的帮助。

最佳答案

如果您在用户界面线程中运行长时间运行的代码,它将阻塞 UI。所以你必须在后台运行这段代码。您可以使用Thread(或类似CompletableFuture)。如果这是一个 Eclipse 插件,您还可以使用 Job 或进度监视器。

在后台线程中,您调用 Display.asyncExec 来运行更新 UI 的代码(因此此处只需调用 printToTerminal)。

当代码已在 UI 线程中运行时调用 Display.asyncExec 不起作用。

关于java - 将进程输入流数据写入 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37593835/

相关文章:

java - Android 从静态上下文中获取 fragment 中的资源

java - 为什么 SwingUtilities.invokeLater() 会导致 JButton 卡住?

JavaFx ListView CellLayout 缩放

c - 简单的c编程gui

java - 将 Java 字符串转换为 WORD、DWORD 或 QWORD

java - netty 4.x.x 中的 UDP 广播

python - 是否有 Tkinter/ttk 样式引用?

java - 使用线程(启动和停止它们)

java - swt中两个复合体之间如何通信

java - 我怎样才能告诉我的表单控件的值发生了变化?