将程序输出附加到JavaFX文本框

将程序输出附加到JavaFX文本框,java,multithreading,javafx,concurrency,runtime,Java,Multithreading,Javafx,Concurrency,Runtime,我有一个批处理文件,应该从我的JavaFX应用程序启动 我尝试了不同的实现: 将程序的输出附加到一个文件中,然后在过程完成后,读取该文件,并将内容附加到我的文本框中 这是错误的,原因有很多,主要是GUI挂起,直到程序完成 所以我研究了如何使用线程,但是当在线程中使用whileprocess.isAlive时,同样的情况也会发生。 我试图在进程运行时这样做,将输出的内容添加到我的文本框中。它只在程序完成后添加,即使我在单独的线程中这样做 我还尝试使用一个平台。runLaternew Runnabl

我有一个批处理文件,应该从我的JavaFX应用程序启动

我尝试了不同的实现:

将程序的输出附加到一个文件中,然后在过程完成后,读取该文件,并将内容附加到我的文本框中

这是错误的,原因有很多,主要是GUI挂起,直到程序完成

所以我研究了如何使用线程,但是当在线程中使用whileprocess.isAlive时,同样的情况也会发生。 我试图在进程运行时这样做,将输出的内容添加到我的文本框中。它只在程序完成后添加,即使我在单独的线程中这样做

我还尝试使用一个平台。runLaternew Runnable。。。。 这样,内容会定期更新,但每次仍然是大块数据,这也会使GUI挂起

然后我发现JavaFX不是线程安全的,并且有一个库:

javafx.concurrent.Task
这里有一个例子:

但是,我仍然不确定我是否正在接近我想要的

基本上,我需要这样的东西,但这使GUI无法挂起:

        Process p = Runtime.getRuntime().exec(executeString);
        InputStream is = p.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        while(p.isAlive())
        {
            String line;
            try
            {
                if ( (line = br.readLine()) != null)
                    logArea.appendText(line + "\n");
            } catch(Exception e)
            {

            }
        }

解决方案只是构造一个任务,如链接中所示,并将我的主要帖子中的代码放入其中

谢谢你,詹姆斯,你的把戏成功了

这是最终结果:

Task task = new Task<Void>()
        {
            @Override
            public Void call()
            {
                try {
                    Process p = Runtime.getRuntime().exec(executeString);                
                    InputStream is = p.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);

                    while(p.isAlive())
                    {
                        String line;
                        if ( (line = br.readLine()) != null)
                            logArea.appendText(line + "\n");
                    }
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
                return null;
            }
        }; 
        new Thread(task).start();

通过查看您的代码,您是否应该在InputStream=p.getInputStream之前先定义进程p;whilep.isAlive是否也应该等待进程结束,然后读取文件?@joakimericson什么文件?他正在阅读过程。您所展示的代码的上下文是什么?这应该在任务的call方法中,并且应该使用Platform.runLater更新文本区域。你能展示更多你的代码吗,比如任务实现和你是如何启动它的,等等。必须简单地将代码放入任务构造函数中。谢谢!嗯。虽然这看起来可行,但您违反了JavaFX的单线程规则。您需要调用logArea.appendText。。。在FX应用程序线程上:Platform.runLater->logArea.appendText。。。;。
                while(p.isAlive())
                {
                    String line;
                    if ((line = br.readLine()) != null)
                    {
                        Platform.runLater(new Runnable() 
                        {
                            @Override
                            public void run()
                            {
                                logArea.appendText(line + "\n");
                            }
                        });
                    }
                }