Как оставаться на том же уровне xml при вызове класса оповещения? - PullRequest
0 голосов
/ 15 апреля 2020

Я создал этот метод для проверки электронной почты. Проблема в том, что отображаемое оповещение идет вверху предыдущего f xml вместо того же самого, и пользователь должен заполнить все поля снова

I есть этот метод

public boolean validateEmail() {
    Pattern p = Pattern.compile("[a-zA-Z0-9][a-zA-Z0-9._]*@[a-zA-Z0-9]+([.][a-zA-Z]+)+");
    Matcher m = p.matcher(emailField.getText());
    if (m.find() && m.group().equals(emailField.getText())) {
        return true;
    } else {
        Alert alert = new Alert(Alert.AlertType.WARNING);
        alert.setTitle("Validation of Email");
        alert.setHeaderText(null);
        alert.setContentText("Please enter a valid Email");
        alert.showAndWait();
        return false;
    }
}

У меня есть кнопка, которая onAction вызывает метод ниже

public void showSubscription() throws IOException {
    Dialog<ButtonType> dialog = new Dialog<>();
    dialog.setTitle("New Subscription");
    dialog.setHeaderText("Please Fulfill your information to subscribe");
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(getClass().getResource("Registration.fxml"));

    try {
        dialog.getDialogPane().setContent(fxmlLoader.load());
    } catch (IOException e) {
        System.out.println("Couldn't load the Dialog");
        e.printStackTrace();
        return;
    }
    dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
    dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);

    Optional<ButtonType> result = dialog.showAndWait();
    if (result.isPresent() && result.get()==ButtonType.OK) {
        RegistrationController controller = fxmlLoader.getController();
        if (controller.validateEmail()) {
            controller.loadRegistration();
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("Information");
            alert.setHeaderText(null);
            alert.setContentText("Subscription Done Correctly");
            alert.showAndWait();
        }
    }

    else {
        System.out.println("CANCEL pressed");
    }
}

Я не знаю, что добавить, чтобы сделать это предупреждение всплывающим в той же регистрации. xml, а не go назад к предыдущему.

1 Ответ

0 голосов
/ 15 апреля 2020

Alert наследует метод initOwner(Window) от Dialog. Таким образом, вы можете позвонить initOwner(...) и перейти в окно, отвечающее за отображение диалога. Нет прямой ссылки на это, но вы можете получить ее из сцены, содержащей диалоговую панель диалога:

alert.initOwner(dialog.getDialogPane().getScene().getWindow());

Эту строку нужно просто вызвать за некоторое время до alert.showAndWait().

Если вам нужно, чтобы Alert, созданный в методе validateEmail(), имел одного и того же владельца, просто передайте ссылку на соответствующее окно этому методу:

public boolean validateEmail(Window mainWindow) {

    // ...
    Alert alert = new Alert(Alert.AlertType.WARNING);
    alert.initOwner(mainWindow);
    // ...
    alert.showAndWait();
    // ...
}

и

RegistrationController controller = fxmlLoader.getController();
if (controller.validateEmail(dialog.getDialogPane().getScene().getWindow())) {
    // ...
}
...