JavaFX动作事件语句执行顺序

时间:2017-08-15 00:04:54

标签: java javafx

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);
}

上面的Export()方法在按钮单击时执行,似乎不按顺序运行方法语句。直到警报窗口弹出后才会显示进度条动画。我怎么能纠正这个?

1 个答案:

答案 0 :(得分:1)

假设您的foo()方法需要很长时间才能运行,那么您正在阻止FX应用程序线程,这会阻止它执行其常规职责,例如呈现UI。因此,虽然语句(当然)按照您编写的顺序执行,即progressProperty的{​​{1}}设置为pg,然后执行-1,然后执行显示foo(),在整个过程完成之前,您实际上看不到用户界面中的结果(实际上,在这种情况下,直到您放弃对FX的控制权为止)应用程序线程通过调用Alert)。

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

onSucceeded