Как установить событие для кнопки диалога исключений JavaFX - PullRequest
0 голосов
/ 23 октября 2018

Сейчас я делаю простую игру судоку от JavaFX.И теперь я столкнулся с некоторыми трудностями в диалоге.Мне пришлось создать две сцены, в меню сцены содержались только кнопки «новая игра» и «продолжить», основная сцена содержала игру судоку.В основной сцене я создал кнопку проверки, чтобы проверить, верен ли ответ геймера, где, если он неправильный, показать диалог, подобный этому img here , и когда он правильный, ему может понравиться этот img здесь .

Тогда я обнаружил, что ПОДТВЕРЖДЕНИЕ ПОДТВЕРЖДЕНИЯ очень похоже.Все, что мне нужно изменить, - это текст кнопки и ее действие, в то время как при нажатии кнопки «Повторить», чтобы вернуться на игровую сцену, и кнопки «Выход», чтобы вернуться к основной сцене.

Теперь я знаю, как настроить действие для кнопкиокно оповещения, но у меня возник новый вопрос для этого, я не знаю, как вызвать ventHandler<ActionEvent> в выражении.

Вот мой код для окна оповещения два

(исходный кодот https://code.makery.ch/blog/javafx-dialogs-official/)

Alert right = new Alert(AlertType.CONFIRMATION);
right.setTitle("Checking Result");
right.setHeaderText(null);
right.setContentText("Your answer is correct. Would you like to start
again");
ButtonType restart = new ButtonType("Restart");
ButtonType quit = new ButtonType("Quit");
right.getButtonTypes().setAll(restart, quit);

Alert wrong = new Alert(AlertType.CONFIRMATION);
wrong.setTitle("Checking Result");
wrong.setHeaderText(null);
wrong.setContentText("Your answer is incorrect. Would you like to try 
again");
ButtonType retry = new ButtonType("Retry");
wrong.getButtonTypes().setAll(retry, quit);

код для действий

Optional<ButtonType> result = right.showAndWait();
if (result.isPresent() && result.get() == quit) {
stage.setScene(main_frame);
}else if(result.isPresent() && result.get() == 
restart) {// call the actionevent clears}

Optional<ButtonType> result = wrong.showAndWait();
if (result.isPresent() && result.get() == quit) {
stage.setScene(main_frame);
}else if(result.isPresent() && result.get() == 
retry) {// call the actionevent clears}

код для обработчика событий

final EventHandler<ActionEvent> clears = new EventHandler<ActionEvent>() {
            @Override
            public void handle(final ActionEvent event) {
                for (int i = 0; i < 9; i++) {
                    for (int j = 0; j < 9; j++) {
                        if (digging_array[i][j] == 1) {
                            sudoku[i][j].setText(Integer.toString(final_Array[i][j]));
                        } else {
                            sudoku[i][j].setText("");
                        }
                    }
                }
            }
        };

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вы правильно изменили тип кнопки в отношении предупреждения right.Ваша последняя строка не меняет кнопки для предупреждения wrong.Замена right на wrong приведет к правильному предупреждению и, следовательно, к изменению его кнопок.

Проверка того, какая кнопка была нажата, может быть выполнена несколькими способами.Выдержка из официальной документации (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Alert.html):

Вариант 1: «Традиционный» подход

Optional<ButtonType> result = alert.showAndWait();
if (result.isPresent() && result.get() == ButtonType.OK) {
    formatSystem();
}

Вариант 2: Традиционный + Факультативный подход

alert.showAndWait().ifPresent(response -> {
    if (response == ButtonType.OK) {
        formatSystem();
    }
});

Вариант3: полностью лямбда-подход

alert.showAndWait()
     .filter(response -> response == ButtonType.OK)
     .ifPresent(response -> formatSystem());

вместо использования ButtonType.OK, вам нужно использовать свои пользовательские кнопки.

EDIT

В вашем примере вы должны изменитькод вроде этого:

void clear() {
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (digging_array[i][j] == 1) {
                sudoku[i][j].setText(Integer.toString(final_Array[i][j]));
            } else {
                sudoku[i][j].setText("");
            }
        }
    }
}

Optional<ButtonType> result = right.showAndWait();
if (result.isPresent() && result.get() == quit) {
    stage.setScene(main_frame);
} else if(result.isPresent() && result.get() == restart) {
    clear()
}

Optional<ButtonType> result = wrong.showAndWait();
if (result.isPresent() && result.get() == quit) {
    stage.setScene(main_frame);
} else if(result.isPresent() && result.get() == retry) {
    clear()
}
0 голосов
/ 23 октября 2018

В связанном уроке есть пример того, как установить пользовательские действия (я его немного укоротил):

Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog with Custom Actions");

ButtonType buttonTypeOne = new ButtonType("One");
ButtonType buttonTypeCancel = new ButtonType("Cancel", ButtonData.CANCEL_CLOSE);

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

Optional<ButtonType> result = alert.showAndWait();
if (result.get() == buttonTypeOne){
    // ... user chose "One"
} else {
    // ... user chose CANCEL or closed the dialog
}

Вы можете получить результат (на что нажал пользователь) через result.get()и проверьте, какая кнопка была нажата (buttonTypeOne, buttonTypeCancel, ...).

Когда пользователь нажимает «One», теперь вы можете сделать что-то в первом теле оператора if.

В вашем коде вы пропускаете звонок showAndWait().Если, например, пользователь был прав, вы должны сделать:

Observable<ButtonType> rightResult = right.showAndWait();

if (rightResult.isPresent()) {
    if (rightResult.get() == restart) { //because "restart" is the variable name for your custom button type
         // some action, method call, ...
    } else { // In this case "quit"

    }
}

Обратите внимание, это, вероятно, не самый элегантный способ (двойной оператор if) сделать это.@Другие не стесняйтесь редактировать мой ответ и предлагать лучший способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...