Java 将进程输入流数据写入GUI

Java 将进程输入流数据写入GUI,java,user-interface,swt,inputstream,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);

我在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();
    }
终端是一个文本对象,我想添加文本,然后使用重画和更新,以便立即向用户显示该行。 我的问题是,我的图形用户界面被卡住了,因为while循环在执行任务和获取行时出错,但我似乎无法在不卡住图形用户界面的情况下获得获取行的解决方案。 我尝试使用display.async函数并在其中包含while循环,但它仍然不起作用,我的GUI也被卡住了

有没有一种方法可以获取进程的输入流并将其打印到GUI而不阻塞它


谢谢你的帮助

如果在用户界面线程中运行长时间运行的代码,它将阻止UI。因此,您必须在后台运行此代码。您可以使用
线程
(或类似
CompletableFuture
)的东西。如果这是一个Eclipse插件,您还可以使用
作业
或进度监视器)

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


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

如果在用户界面线程中运行长时间运行的代码,它将阻止UI。因此,您必须在后台运行此代码。您可以使用
线程
(或类似
CompletableFuture
)的东西。如果这是一个Eclipse插件,您还可以使用
作业
或进度监视器)

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


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

为什么这个问题被标记为Python?我错误地删除了标记为什么这个问题被标记为Python?我错误地删除了标记所以如果您建议尝试在Display.async中的while循环中放置printToTerminal函数?是的,您需要将读取文件的代码放在后台线程中。每次您有一行要添加到UI时,您都会调用
Display.asynceec
(或者
Display.syncExec
,如果您想等待它显示)。因此,如果您建议尝试将printToTerminal放入Display.async函数中的while循环中,请选择“是”,您需要将读取文件的代码放在后台线程中。每次有一行要添加到用户界面时,您都会调用
Display.asynceec
(或者
Display.syncExec
,如果您想等待它显示)。