JavaFX-在执行后台任务时,有没有办法进入JavaFX线程?

JavaFX-在执行后台任务时,有没有办法进入JavaFX线程?,java,multithreading,javafx,task,Java,Multithreading,Javafx,Task,我有以下任务,其中我导入一个文件。该方法使用ProgressBar启动对话框,ProgressBar中的progressProperty绑定到任务的progressProperty。现在我想检查ProgressBar是否已经完成了,但是我必须在一个特殊的类中使用ProgressBar,并且在执行任务时不能访问任何其他类中的方法。现在,我的问题是,如何确保程序检查ProgressBar是否完成,因为我的对话框只有在ProgressBar完成时才会关闭,而在当前时刻,对话框永远不会关闭。这是我的密码

我有以下任务,其中我导入一个文件。该方法使用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());