JavaFX动作事件语句执行顺序
上面的导出方法在单击按钮时执行,似乎会无序运行方法语句。在弹出警报窗口之前,进度条动画不会显示。如何更正此问题?假设您的foo方法需要很长时间才能运行,那么发生的情况是您正在阻止FX应用程序线程,这会阻止它执行通常的任务,例如呈现UI。因此,虽然语句当然是按照您编写它们的顺序执行的,即pg的progressProperty设置为-1,然后执行foo,然后显示警报,但在整个过程完成之前,您实际上不会在UI中看到这些语句的结果,或者,在这种情况下,直到您通过调用showAndWait放弃对FX应用程序线程的控制为止 解决这个问题的基本方法是在后台线程中运行foo。如果您希望在完成时执行与UI相关的代码,那么最好的方法是使用,并使用其onSucceeded处理程序在最后执行UI代码。所以一般来说,你会这样做:JavaFX动作事件语句执行顺序,java,javafx,Java,Javafx,上面的导出方法在单击按钮时执行,似乎会无序运行方法语句。在弹出警报窗口之前,进度条动画不会显示。如何更正此问题?假设您的foo方法需要很长时间才能运行,那么发生的情况是您正在阻止FX应用程序线程,这会阻止它执行通常的任务,例如呈现UI。因此,虽然语句当然是按照您编写它们的顺序执行的,即pg的progressProperty设置为-1,然后执行foo,然后显示警报,但在整个过程完成之前,您实际上不会在UI中看到这些语句的结果,或者,在这种情况下,直到您通过调用showAndWait放弃对FX应用程
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();
}