JavaFX-在执行后台任务时,有没有办法进入JavaFX线程?
我有以下任务,其中我导入一个文件。该方法使用ProgressBar启动对话框,ProgressBar中的progressProperty绑定到任务的progressProperty。现在我想检查ProgressBar是否已经完成了,但是我必须在一个特殊的类中使用ProgressBar,并且在执行任务时不能访问任何其他类中的方法。现在,我的问题是,如何确保程序检查ProgressBar是否完成,因为我的对话框只有在ProgressBar完成时才会关闭,而在当前时刻,对话框永远不会关闭。这是我的密码:JavaFX-在执行后台任务时,有没有办法进入JavaFX线程?,java,multithreading,javafx,task,Java,Multithreading,Javafx,Task,我有以下任务,其中我导入一个文件。该方法使用ProgressBar启动对话框,ProgressBar中的progressProperty绑定到任务的progressProperty。现在我想检查ProgressBar是否已经完成了,但是我必须在一个特殊的类中使用ProgressBar,并且在执行任务时不能访问任何其他类中的方法。现在,我的问题是,如何确保程序检查ProgressBar是否完成,因为我的对话框只有在ProgressBar完成时才会关闭,而在当前时刻,对话框永远不会关闭。这是我的密码
public void readFile(File chat) {
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
if(chat.getName().contains("KakaoTalk_")) {
String s = "";
String gesamt = "";
double laenge = 0;
try(BufferedReader brCount = new BufferedReader(new FileReader(chat))) {
while((s=brCount.readLine())!=null) {
laenge++;
}
} catch (IOException e) {
System.out.println("Fehler beim zählen");
}
double momentanErreicht = 0;
try(BufferedReader br = new BufferedReader(new FileReader(chat))) {
while((s=br.readLine())!=null) {
momentanErreicht++;
updateProgress(momentanErreicht, laenge);
s = s.replace("ß", "ß");
s = s.replace("ö", "ö");
s = s.replace("ü", "ü");
s = s.replace("ä", "ä");
s = s.replace("Ä", "Ä");
s = s.replace("Ãœ", "Ü");
s = s.replace("Ö", "Ö");
gesamt += s+"\n";
}
} catch (FileNotFoundException e1) {
System.out.println("File not found");
} catch (IOException e2) {
System.out.println("IOException");
}
mp.isFortschrittDialogCompleted();
mp.eingabeSetText(gesamt);
setChat(mp.eingabeGetText());
getChat();
} else mp.mhNichtPassendesFile();
return null;
}
};
mp.progressP().bind(task.progressProperty());
mp.startFortschrittDialog();
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
mp.isFortschrittDialogCompleted();
}
以及带有进度条的对话框:
public class FortschrittDialog extends Dialog {
private ProgressBar pb = new ProgressBar();
public FortschrittDialog() {
pb.setPrefWidth(500);
pb.setProgress(-1f);
getDialogPane().setContent(pb);
}
public DoubleProperty getPBProgressProperty() {
return pb.progressProperty();
}
public boolean isCompleted() {
if(pb.getProgress()==1.0) return true;
else return false;
}
}
我希望任何人都能理解我的问题,并能给我一个快速简单的解决方案,如果可能的话,甚至解释。如果您缺少某些代码,请根据此问题的一个答案告诉,您只能在对话框窗格上有一个已定义的按钮时关闭对话框,然后您可以执行以下操作:
Window window = dialog.getDialogPane().getScene().getWindow();
window.setOnCloseRequest(event -> dialog.close());
正如@James_D在评论中提到的,你可以使用
task.setOnSucceeded(event -> window.hide());
这是答案中与您相关的部分:
JavaFX对话框只能“异常”关闭,如上文中所定义
两种情况:
当对话框只有一个按钮时,
当对话框有多个
按钮,只要其中一个符合以下条件之一
要求:
按钮有一个ButtonType,其ButtonData类型为
按钮A.取消\关闭。
按钮有一个ButtonType,其ButtonData
调用ButtonData.isCancelButton时返回true。。。
如果使用此解决方案,则不必使用doubleProperty和isCompleted方法。我没有阅读您的代码,但您是指UI线程吗?行吗?嗯,是的,我说的是UI线程,至少,这就是我想说的。。。我不太清楚如何使用这个Platform.runLater,但是当我尝试时,我喜欢:Platform.runLatermp.isFortschrittDialogCompleted;它告诉我必须将返回类型从boolean更改为Runnable。您可以执行以下操作:Platform.runLater->mp.isFortschrittDialogCompleted,但您不会返回boolean返回值。看起来您当前没有使用该值,因此应该可以。您在启动任务后立即调用mp.isFortschrittDialogCompleted:很明显,此时任务将无法完成。这种方法似乎是错误的:与其使用progress属性,不如向任务注册onSucceeded处理程序,然后从那里关闭对话框。如果我正确理解您的代码,您只需要task.setOnSucceedede->mp.endfortschrittdilog;。为什么后台任务要询问UI是否已完成?除此之外,如果您想读取UTF-8文件,您应该使用UTF-8编码读取该文件,而不是使用错误的编码读取该文件并进行字符串替换。例如,java.nio.file.Files.readAllLineschat.toPath将所有行读取到列表中,甚至默认使用UTF-8编码,但您可以指定另一种编码作为第二个参数。谢谢,我刚刚了解到关闭对话框的问题:D它现在似乎起作用了,谢谢你的帮助^^
task.setOnSucceeded(event -> window.hide());