gpt4 book ai didi

java - 将程序输出附加到 JavaFX TextBox

转载 作者:行者123 更新时间:2023-12-01 06:10:08 25 4
gpt4 key购买 nike

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

我尝试了不同的实现:

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

由于多种原因,这是错误的,主要是因为 GUI 挂起,直到程序完成。

所以我研究了使用线程,但是当在线程中使用 while(process.isAlive()) 时,会发生同样的事情。我尝试这样做,以便在进程运行时将输出内容添加到我的文本框中。它只会在程序完成后添加,即使我在单独的线程中执行此操作。

我也尝试使用Platform.runLater(new Runnable() ...。这样,内容会定期更新,但一次仍然是大块数据,并且还会导致 GUI 挂起。

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

javafx.concurrent.Task

这里有一个例子: https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

但是,我仍然不确定我是否越来越接近我正在寻找的东西......

基本上,我需要这样的东西,但这使得 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)
{

}
}

最佳答案

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

谢谢 James_D,你的技巧成功了。

这是最终结果:

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();

编辑:阅读更多文档后...

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html

Platform.runLater and Task in JavaFX

代码已更新为:

                while(p.isAlive())
{
String line;
if ((line = br.readLine()) != null)
{
Platform.runLater(new Runnable()
{
@Override
public void run()
{
logArea.appendText(line + "\n");
}
});
}
}

关于java - 将程序输出附加到 JavaFX TextBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36221324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com