我正在使用Java FX textarea并使用它来提供正在进行的步骤的信息。
步骤如下。 复制文件。 删除旧文件。 复制新文件。 然后将一些属性从旧文件复制到新文件。
单击按钮时,整个步骤开始。
我面临的问题是,只要我使用append命令,文本区域就不会更新。
append命令添加数据,当函数终止时,我将所有文本放在一起。 我希望在调用函数时更新文本区域。
在我的程序中,复制文件操作需要一些时间,因为它是一个大文件。 所以在开始时我会显示操作已经开始的消息。 并且在操作结束时我想显示操作已经结束。
但是文本区域一起显示所有这些文本。
我在oracle论坛上看到,FX中的文本区域使用单个线程,因此在整个过程完成之前不会显示任何内容。
文章:https://community.oracle.com/message/9938117#9938117
任何人都可以建议我该怎么办。
新编辑
好的按钮点击我正在调用一个执行以下方法的函数。
public void executeCmds(){
createTempDirectory();
copyConfigPropetiesFileValues();
copyConfigProperties();
copyYMLFile();
copyYMLFileProperties();
stopTomcatServer();
deleteOldWar();
copyNewWar();
startTomcatServer();
copyOldConfigFile();
copyOldYMLFile();
}
现在每个函数都是一个进程,应该按顺序执行。完成每个步骤后,我想更新GUI文本区域,并显示已完成的成功消息。
对于我使用的方法如下:
public void createTempDirectory(){
//Creating temporary directory for copying property files
status_text_area.appendText("Trying to create a temp directory \n");
File tempDir= new File(tomcat_path.getText()+filePath.path_to_temp_directory);
if(!tempDir.exists())
tempDir.mkdirs();
status_text_area.appendText("Created Temp directory to copy Config Files \n");
}
与其他功能相同。 copyWar文件函数和删除warfile函数需要花费时间,因为它将130 MB文件从一个位置复制到另一个位置。
所以我希望textarea显示为, 1.开始复制文件 过了一段时间
但问题是,在执行所有功能之前,文本区域根本不会填充。
如果我尝试通过线程执行这些操作,则不保证执行顺序。 请帮忙
答案 0 :(得分:4)
在后台线程中运行您的executeCmds()
方法并使用Platform.runLater()
更新文本区域:
public void executeCmds(){
Thread thread = new Thread(() -> {
createTempDirectory();
copyConfigPropetiesFileValues();
copyConfigProperties();
copyYMLFile();
copyYMLFileProperties();
stopTomcatServer();
deleteOldWar();
copyNewWar();
startTomcatServer();
copyOldConfigFile();
copyOldYMLFile();
});
thread.start();
}
然后
public void createTempDirectory(){
//Creating temporary directory for copying property files
updateStatus("Trying to create a temp directory \n");
File tempDir= new File(tomcat_path.getText()+filePath.path_to_temp_directory);
if(!tempDir.exists())
tempDir.mkdirs();
updateStatus("Created Temp directory to copy Config Files \n");
}
// similarly for other methods
private void updateStatus(String message) {
if (Platform.isFxApplicationThread()) {
status_text_area.appendText(message);
} else {
Platform.runLater(() -> status_text_area.appendText(message));
}
}
答案 1 :(得分:0)
扩展已批准的回复 - 如果您在执行任何其他操作之前需要等待更新的用户界面,请使用PlatformImpl.runAndWait(Runnable runnable)
Thread thread = new Thread(() -> {
yourMethod();
PlatformImpl.runAndWait(() -> {
methodForUI();
});
methodAfterUIChanged();
});
thread.start();
答案 2 :(得分:-3)
请你提供一些代码摘录?
我经常犯一个类似的错误:concat返回连接字符串,不会修改应用了concat方法的字符串。
String firstString = "txt";
String resultString = firstString.concat(" next");
如果您的问题确实与线程有关,并且如果您的代码与文章中提到的代码相近,我建议您通过并行线程复制数据
javafx.application.Platform.runLater(e -> {
// Do some long operation there
});
请参阅有关Task和runlater的现有文章:
Platform.runLater and Task in JavaFX
编辑:正如James_D所提到的,如果操作很长,你最好使用任务。阅读我链接的文章,了解有关替代品及其用途的更多信息。