当前位置: 首页 > 知识库问答 >
问题:

如何为 JavaFX 异常对话框的按钮设置操作事件

赵智
2023-03-14

我现在正在用JavaFX做一个简单的数独游戏。现在我在对话中遇到了一些困难。我创建了两个场景,菜单场景只包含“新游戏”和“继续”按钮,主场景包含数独游戏。在主场景中,我创建了一个检查按钮来检查玩家的答案是否正确,如果答案不正确,则在此处显示一个类似于此img的对话框,如果答案正确,则可能在此处显示此img。

然后我发现确认警报很相似。所有我需要改变的是按钮的文字和它的动作,而当点击重试回到游戏场景,点击退出回到主场景。

现在我知道如何为警告框中的按钮设置动作,但是我有一些新的问题,我不知道如何调用< code>ventHandler

这是我的两个警报框的代码

(源代码来自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个答案

孔城
2023-03-14

在链接的教程中,有一个关于如何设置自定义操作的示例(我缩短了一下):

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
}

您可以通过< code>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语句)。@其他人可以随意编辑我的答案,放入更好的做法。

宋望
2023-03-14

关于< code >右侧警报,您确实正确地更改了按钮类型。您的最后一行没有更改< code >错误警报的按钮。将< code>right替换为< code > error 将针对正确的警报,从而更改其按钮。

可以通过多种方式检查按下了哪个按钮。摘自官方文件(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());

而不是使用<code>按钮类型。好的您需要使用自定义按钮。

在您的示例中,您必须像这样修改代码:

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()
}
 类似资料:
  • 我有一个按钮,可以设置一个动作,比如 如何从该按钮中删除此EventFilter?我尝试了方法,但应该是什么参数?

  • 问题内容: 我有一个Android应用程序,它使用一些自定义对话框,这些对话框是从XML布局扩展而来的。对话框视图的内容来自XML布局,但是实际的正负按钮是通过调用构建器的setPositiveButton和setNegativeButton方法添加的,因此我无法控制(或至少不知道如何控制)样式按钮本身。 请从我的LoginConfirmationDialog.java文件中查看下面的onCrea

  • 问题内容: 这是一个滑块难题。拼图完成后,我想显示一个带有“确定”按钮的对话框。当按下“确定”按钮时,我使用来通过Android浏览器加载网站。唯一的问题是,使用当前代码,当拼图完成后,它不会加载一个框(当我使用时会加载)。它什么也没做。有任何想法吗? 问题答案: 试试这个

  • 如何使计时器对话框的按钮可以改变位置?此对话框不能被pad远程电视使用,我希望此对话框的按钮可以从pad远程电视获得焦点。有人能帮我吗?

  • 问题内容: 我正在尝试使用以下代码设置按钮文本: 这是我的FXML: 但这行不通,我不明白为什么,还有其他人知道如何使用JavaFX设置按钮文本吗?>。>; 我觉得JavaFX不像Swing那样简单…但是无论如何,有人知道我在做什么错吗?另外,有没有人知道有什么资源可以学习FXML?我喜欢FXML而不是用Java进行编码,但是似乎没有太多的东西,我是否是世界上唯一喜欢FXML而不是JavaFX G

  • 我可以创建一个没有消极或积极按钮的对话框。这在特定行动后会摧毁它自己吗?