簡體   English   中英

如何為JavaFX異常對話框的按鈕設置動作事件

[英]How to set action event for JavaFX Exception Dialog's button

我現在正在用JavaFX做一個簡單的數獨游戲。 現在我在對話上遇到了一些困難。 我創建了兩個場景,菜單場景僅包含“新游戲”和“繼續”按鈕,主要場景包含數獨游戲。 在主場景中,我創建了一個檢查按鈕來檢查玩家的答案是否正確,如果答案不正確,則在此處顯示一個類似於此img的對話框,如果正確,則可能在此處顯示img

然后我發現CONFIRMATION ALERT非常相似。 我需要更改的只是按鈕的文本及其動作,而單擊“重試”返回到游戲場景,然后單擊“退出”返回到主場景。

現在我知道如何在警報中的按鈕設置動作,但我有一些新的問題,我不知道如何調用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("");
                        }
                    }
                }
            }
        };

您確實正確更改了有關right警報的按鈕類型。 最后一行不會更改wrong警報的按鈕。 更換rightwrong將瞄准正確的警報,從而改變它的按鈕。

檢查按下哪個按鈕可以通過多種方式完成。 摘自官方文檔( 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:完全lambda方法

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

而不是使用ButtonType.OK您需要使用自定義按鈕。

編輯

在您的示例中,您必須像這樣修改代碼:

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

在鏈接的教程中,有一個有關如何設置自定義動作的示例(我將其縮短了一點):

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()獲取結果(用戶單擊了什么result.get()並檢查按下了哪個按鈕(buttonTypeOne,buttonTypeCancel,...)。

現在,當用戶按下“一個”時,您可以在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語句)。 @Others可以隨意編輯我的答案,並以更好的方式進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM