我现在正在用JavaFX做一个简单的数独游戏。现在我在对话上遇到了一些困难。我创建了两个场景,菜单场景仅包含“新游戏”和“继续”按钮,主要场景包含数独游戏。在主场景中,我创建了一个检查按钮来检查玩家的答案是否正确,如果答案不正确,则显示类似img here的对话框,如果正确,则可能类似于img here。
然后,我发现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("");
}
}
}
}
};
答案 0 :(得分:1)
您确实已正确更改关于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:完全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()
}
答案 1 :(得分:0)
在链接的教程中,有一个有关如何设置自定义操作的示例(我将其缩短了一点):
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等)。
当用户按下“一个”时,您现在可以在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可以随意编辑我的答案,并以更好的方式进行操作。