Java Закрытие диалога возвращает то же значение, что и отмена? - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь написать диалоговую функцию, которая возвращает значение типа int (1, -1 или 0) в соответствии с выбором пользователя («подтвердить», «нет» или закрыть диалоговое окно).

Но всякий раз, когда я закрываю диалоговое окно, оно возвращает то же значение, что и при выборе кнопки «нет».

есть ли способ решить эту проблему?

Заранее спасибо:)

/ ** * Показывает окно подтверждения и возвращает целочисленное значение выбора пользователя * @param title * @param text * @return * @return 1, если подтверждено, -1, если не подтверждено, 0 в случае отмены * /

public static int strictConfirmBox(String title, String text, String yesString, String noString) {
    ButtonType okBttn = new ButtonType(yesString, ButtonData.YES);
    ButtonType noBttn = new ButtonType(noString, ButtonData.NO);

    Alert alert = new Alert(Alert.AlertType.CONFIRMATION, text, noBttn, okBttn);
    alert.setTitle(title);
    alert.setHeaderText(null);
    alert.setGraphic(null);
    Label msg = new Label(text);
    msg.setWrapText(true);
    alert.getDialogPane().setContent(msg);

    alert.showAndWait();



    if(alert.getResult()==ButtonType.CLOSE){
        //closed dialog
        return 0;
    }else if(alert.getResult()==ButtonType.YES){
        //selected yes
        return 1;
    }
    // else if(alert.getResult()==ButtonType.NO){
    //selected no
    return -1;
}

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

Код в javafx.scene.control.Dialog.close() находит первую кнопку, которая возвращает true для isCancelButton (). Это поведение подробно описано в разделе " Правила закрытия диалога " в официальном Javado c для javafx.scene.control.Dialog.

for (ButtonType button : getDialogPane().getButtonTypes()) {
    ButtonData buttonData = button.getButtonData();
    if (buttonData == null) continue;

    if (buttonData == ButtonData.CANCEL_CLOSE) {
        cancelButton = button;
        break;
    }
    if (buttonData.isCancelButton()) {
        cancelButton = button;
    }
}

Следовательно лучшее, что я могу предложить, это использовать тип «ДРУГОЙ» вместо типа ButtonData.NO. Это предотвратит закрытие диалога, поэтому пользователь вынужден выбрать ДА или НЕТ

ButtonType okBttn = new ButtonType("yes", ButtonData.YES);
ButtonType noBttn = new ButtonType("no", ButtonData.OTHER);

В качестве альтернативы вы можете добавить явный параметр закрытия, который будет выбран, если диалоговое окно закрыто вручную.

ButtonType okBttn = new ButtonType("yes", ButtonData.YES);
ButtonType noBttn = new ButtonType("no", ButtonData.OTHER);
ButtonType closeButton = new ButtonType("Close", ButtonData.CANCEL_CLOSE);
0 голосов
/ 05 февраля 2020

Этот код прибывает из https://code.makery.ch/blog/javafx-dialogs-official/. Вы должны использовать Optional<ButtonType> result = alert.showAndWait();. Возвращает результат после выполнения действия. Используйте этот результат и if-statement для возврата необходимого значения.

Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog with Custom Actions");
alert.setHeaderText("Look, a Confirmation Dialog with Custom Actions");
alert.setContentText("Choose your option.");

ButtonType buttonTypeOne = new ButtonType("One");
ButtonType buttonTypeTwo = new ButtonType("Two");
ButtonType buttonTypeThree = new ButtonType("Three");
ButtonType buttonTypeCancel = new ButtonType("Cancel", ButtonData.CANCEL_CLOSE);

alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree, buttonTypeCancel);

Optional<ButtonType> result = alert.showAndWait();
if (result.get() == buttonTypeOne){
    // ... user chose "One"
} else if (result.get() == buttonTypeTwo) {
    // ... user chose "Two"
} else if (result.get() == buttonTypeThree) {
    // ... user chose "Three"
} else {
    // ... user chose CANCEL or closed the dialog
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...