JavaFX:警告自动关闭对话框

时间:2017-04-30 12:50:50

标签: intellij-idea javafx dialog alert fxml

我是一名初学者,在JavaFX中创建一个简单的练习应用程序。我使用一个带有3个文本字段和一个日期选择器的对话框来创建" Items"要添加为SQLite数据库中的条目。

我尝试使用警报进行数据验证。如果一个或多个字段为空,并在对话框中按下确定按钮,则会弹出警报。问题是关闭警报也会关闭对话框。

如何在不导致对话框关闭的情况下显示警报并关闭?

这是我用于"新项目"的方法。在主窗口控制器中按钮,弹出对话框:

 @FXML
public void newItem() {

    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(getClass().getResource("newEventDialog.fxml"));
    try {
        dialog.getDialogPane().setContent(fxmlLoader.load());
    } catch (IOException e) {
        System.out.println("Error loading new Dialog : " + e.getMessage());
    }

    newEventDialogController newController = fxmlLoader.getController();

    dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);


    Optional<ButtonType> result = dialog.showAndWait();


    if (result.isPresent() && result.get() == ButtonType.OK) {

            newController.addItem();
            refreshList();



    }
}

这是Dialog控制器中包含警报的方法:

public void addItem() {
    if (validateFields()) {

        String eventdate = datepick.getValue().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));

        Item item = new Item(namefield.getText(), emailfield.getText(), typefield.getText(), eventdate);
        Datasource.getInstance().insertEvent(item);
    } else {
        Alert alert = new Alert(Alert.AlertType.ERROR);

        alert.setContentText("Error: One or more fields are empty.");
        alert.showAndWait();


    }

}

感谢您的时间,以及所有回复。

1 个答案:

答案 0 :(得分:1)

您可以截取ButtonType.OK的{​​{1}}动作。试试这个。

Dialog

在Dialog的控制器中

dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
final Button btOk = (Button)dialog.getDialogPane().lookupButton(ButtonType.OK);
btOk.addEventFilter(ActionEvent.ACTION, event -> {
   if (newController.addItem()) {
       refreshList();
   } else {
       event.consume();  // Make dialog NOT to be closed.
   }
});

Optional<ButtonType> result = dialog.showAndWait();

此方法已在// Return false, if you want NOT to close dialog. public boolean addItem() { if (validateFields()) { String eventdate = datepick.getValue().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")); Item item = new Item(namefield.getText(), emailfield.getText(), typefield.getText(), eventdate); Datasource.getInstance().insertEvent(item); return true; } else { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setContentText("Error: One or more fields are empty."); alert.showAndWait(); return false; } } API文档中进行了描述。 Dialog Validation / Intercepting Button Actions