Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX动作事件语句执行顺序_Java_Javafx - Fatal编程技术网

JavaFX动作事件语句执行顺序

JavaFX动作事件语句执行顺序,java,javafx,Java,Javafx,上面的导出方法在单击按钮时执行,似乎会无序运行方法语句。在弹出警报窗口之前,进度条动画不会显示。如何更正此问题?假设您的foo方法需要很长时间才能运行,那么发生的情况是您正在阻止FX应用程序线程,这会阻止它执行通常的任务,例如呈现UI。因此,虽然语句当然是按照您编写它们的顺序执行的,即pg的progressProperty设置为-1,然后执行foo,然后显示警报,但在整个过程完成之前,您实际上不会在UI中看到这些语句的结果,或者,在这种情况下,直到您通过调用showAndWait放弃对FX应用程

上面的导出方法在单击按钮时执行,似乎会无序运行方法语句。在弹出警报窗口之前,进度条动画不会显示。如何更正此问题?

假设您的foo方法需要很长时间才能运行,那么发生的情况是您正在阻止FX应用程序线程,这会阻止它执行通常的任务,例如呈现UI。因此,虽然语句当然是按照您编写它们的顺序执行的,即pg的progressProperty设置为-1,然后执行foo,然后显示警报,但在整个过程完成之前,您实际上不会在UI中看到这些语句的结果,或者,在这种情况下,直到您通过调用showAndWait放弃对FX应用程序线程的控制为止

解决这个问题的基本方法是在后台线程中运行foo。如果您希望在完成时执行与UI相关的代码,那么最好的方法是使用,并使用其onSucceeded处理程序在最后执行UI代码。所以一般来说,你会这样做:

public class MainController {
@FXML
public Button browse_report;
@FXML
public Button browse_directory;
@FXML
public Button export;
@FXML
public Button close;
@FXML
public Label report;
@FXML
public Label directory;
@FXML
public Label processing;
@FXML
public TextField report_text;
@FXML
public TextField directory_text;
@FXML
public ProgressBar pg = new ProgressBar();



public void closeButton(ActionEvent e) {
    System.exit(0);
}

public void getReport(ActionEvent e) {
    FileChooser fc = new FileChooser();
    File file=fc.showOpenDialog(null);
    report_text.setText(file.getAbsolutePath());
}

public void getDirectory(ActionEvent e) {
    DirectoryChooser dc = new DirectoryChooser();
    File file =dc.showDialog(null);
    directory_text.setText(file.getAbsolutePath());

}

public void Export(ActionEvent e) {

    pg.setProgress(-1);
    foo();
    Alert alert = new Alert(AlertType.INFORMATION, "Spreadsheet Generated", ButtonType.CLOSE);
    alert.showAndWait();
    pg.setProgress(1);
}

福代表什么?它是一个需要很长时间才能运行的进程吗?它是一个新类的实例化,该类调用方法将文本文件转换为excel文件。因为文本文件很大,并且存储在网络驱动器上,所以大约需要5秒钟。我真的只是想让gui在这5秒钟内看起来像是在思考,这样用户就不会觉得它冻结了或者什么都没做。所以你需要在后台线程上这样做。如果在FX应用程序线程上运行该线程,则会阻止该线程呈现UI,直到您使用showAndWaitThank有效地控制它。我试过了,承认我对线程不是很熟悉。我将其设置为在新线程中运行的任务。但是当以这种方式设置时,该方法似乎会启动新线程,然后立即启动警报窗口,而无需等待线程完成。如何设置它,使alertbox仅在线程完成后弹出?
public void Export(ActionEvent e) {

    pg.setProgress(-1);
    Task<Void> task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            foo();
            return null ;
        }
    };
    task.setOnSucceeded(evt -> {
        Alert alert = new Alert(AlertType.INFORMATION, "Spreadsheet Generated", ButtonType.CLOSE);
        alert.showAndWait();
        pg.setProgress(1);

    });
    new Thread(task).start();
}