将程序输出附加到JavaFX文本框
我有一个批处理文件,应该从我的JavaFX应用程序启动 我尝试了不同的实现: 将程序的输出附加到一个文件中,然后在过程完成后,读取该文件,并将内容附加到我的文本框中 这是错误的,原因有很多,主要是GUI挂起,直到程序完成 所以我研究了如何使用线程,但是当在线程中使用whileprocess.isAlive时,同样的情况也会发生。 我试图在进程运行时这样做,将输出的内容添加到我的文本框中。它只在程序完成后添加,即使我在单独的线程中这样做 我还尝试使用一个平台。runLaternew Runnable。。。。 这样,内容会定期更新,但每次仍然是大块数据,这也会使GUI挂起 然后我发现JavaFX不是线程安全的,并且有一个库:将程序输出附加到JavaFX文本框,java,multithreading,javafx,concurrency,runtime,Java,Multithreading,Javafx,Concurrency,Runtime,我有一个批处理文件,应该从我的JavaFX应用程序启动 我尝试了不同的实现: 将程序的输出附加到一个文件中,然后在过程完成后,读取该文件,并将内容附加到我的文本框中 这是错误的,原因有很多,主要是GUI挂起,直到程序完成 所以我研究了如何使用线程,但是当在线程中使用whileprocess.isAlive时,同样的情况也会发生。 我试图在进程运行时这样做,将输出的内容添加到我的文本框中。它只在程序完成后添加,即使我在单独的线程中这样做 我还尝试使用一个平台。runLaternew Runnabl
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");
}
});
}
}