Concurrency 活动日志在JavaFX中未得到持续更新
我正在linux上使用JSCH执行一些命令,并获取该命令的输出,并将其打印到JAVAFX应用程序的活动日志中 这里有一个问题:活动日志区域在打印一些行后被卡住。但是,如果我从窗口切换回来,应用程序将继续在日志区域打印行。我已经调试了好几次,但都没有发现问题 下面是代码Concurrency 活动日志在JavaFX中未得到持续更新,concurrency,javafx-2,Concurrency,Javafx 2,我正在linux上使用JSCH执行一些命令,并获取该命令的输出,并将其打印到JAVAFX应用程序的活动日志中 这里有一个问题:活动日志区域在打印一些行后被卡住。但是,如果我从窗口切换回来,应用程序将继续在日志区域打印行。我已经调试了好几次,但都没有发现问题 下面是代码 channel.connect(); PrintStream commander = new PrintStream(channel.getOutputStream(), true); commander.println(com
channel.connect();
PrintStream commander = new PrintStream(channel.getOutputStream(), true);
commander.println(command_cd);
commander.println(" exit;");
commander.close();
InputStream outputstream_from_the_channel = channel.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(outputstream_from_the_channel));
String jarOutput;
BufferedWriter bw = new BufferedWriter(new FileWriter(resultLogFile.getAbsolutePath(), true));
while ((jarOutput = reader.readLine()) != null) {
this.logger.info("Status Update = " + jarOutput);
System.out.print("Status Update on screen ="+jarOutput + "\n");
bw.write(jarOutput);
bw.newLine();
outputFromUnix.append(jarOutput).append("\n");
// Display in activity log area in realtime.
if (DeploymentTaskController.actLogTArea != null) {
System.out.println("outputFromUnix.toString()---->>>>> " + outputFromUnix.toString());
//actlogArea is TextArea
DeploymentTaskController.actLogTArea.setText(outputFromUnix.toString());
DeploymentTaskController.actLogTArea.end();
}
}
bw.close();
reader.close();
JavaFX有一个名为“JavaFX应用程序线程”的特殊线程来更新所有UI。此线程不应用于任何非UI操作,所有UI操作必须在该线程上运行 确保在单独的线程中运行代码,并将所有UI代码包装到
Platform#runLater()
中执行
// Using separate thread to run data loading code
new Thread(new Runnable() {
public void run() {
channel.connect();
// [...] all your channel reading code
// Updating UI from JavaFX Application Thread
if (DeploymentTaskController.actLogTArea != null) {
System.out.println("outputFromUnix.toString()---->>>>> " + outputFromUnix.toString());
final String outputStr = outputFromUnix.toString();
Platform.runLater(new Runnable() {
@Override
public void run() {
DeploymentTaskController.actLogTArea.setText(outputStr);
DeploymentTaskController.actLogTArea.end();
}
});
}
bw.close();
reader.close();
}
}).start();
JavaFX中还有一个特殊的并发API用于此类任务,请参见此处:非常感谢Sergey!!