您好,对于另一个Javafx应用程序,我一直在测试警报,唯一无法通过按警报框的“ X”按钮进行操作。
我在下面添加了代码,但是如果您没有时间运行它,这是GIF,用于说明我的警报框存在哪些问题: https://giant.gfycat.com/GeneralUntimelyBluewhale.webm
我不确定如何将gif上传到实际帖子,对此感到抱歉。
有什么办法可以解决此问题?
谢谢
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Playground extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
VBox root = new VBox(100);
root.setPadding(new Insets(10));
root.setAlignment(Pos.CENTER);
Button button = new Button("Alert");
button.setOnAction(event -> {
ButtonType goodButton = new ButtonType("Good");
ButtonType badButton = new ButtonType("Bad");
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", goodButton, badButton);
alert.showAndWait();
if (alert.getResult().equals(goodButton)) {
System.out.println("Good");
} else if (alert.getResult().equals(badButton)) {
System.out.println("Bad");
}
});
// Add the buttons to the layout
root.getChildren().addAll(button);
// Show the Stage
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
答案 0 :(得分:3)
根据Dialog API文档中的“对话框关闭规则”,仅当至少一个按钮的类型为“ CANCEL”时,默认的“ X”按钮才能正常工作。因此,将您的任何按钮更改为ButtonType.CANCEL应该在单击“ X”时关闭对话框。
如果您对使用内置按钮不感兴趣,则必须根据需要显式处理对话框的关闭请求。
ButtonType goodButton = new ButtonType("Good");
ButtonType badButton = new ButtonType("Bad");
Alert alert = new Alert(Alert.AlertType.ERROR,"",goodButton,badButton);
Window window = alert.getDialogPane().getScene().getWindow();
window.setOnCloseRequest(e -> alert.hide());
Optional<ButtonType> result = alert.showAndWait();
result.ifPresent(res->{
if (res.equals(goodButton)) {
System.out.println("Good");
} else if (res.equals(badButton)) {
System.out.println("Bad");
}
});
答案 1 :(得分:0)
要添加到Sai Dandem's answer中,请参见Dialog
中的相关Javadoc:
...
对话框关闭规则
重要的是要了解关闭对话框时会发生什么,以及如何关闭对话框,特别是在异常关闭情况下(例如,在对话框标题栏中单击“ X”按钮或操作时)输入系统特定的键盘快捷键(例如Windows上的alt-F4)。幸运的是,在这些情况下结果是明确定义的,可以在以下要点中最好地总结一下:
- JavaFX对话框只能在两种情况下“异常”关闭(如上定义):
- 对话框只有一个按钮时,或者
- 当对话框具有多个按钮时,只要其中一个按钮满足以下要求之一:
- 该按钮有一个ButtonType,其ButtonBar.ButtonData的类型为ButtonBar.ButtonData.CANCEL_CLOSE。
- 该按钮有一个ButtonType,当调用ButtonBar.ButtonData时,其ButtonBar.ButtonData.isCancelButton()返回true。
- 在所有其他情况下,对话框将拒绝响应所有关闭请求,并保持打开状态,直到用户单击对话框DialogPane区域中的可用按钮之一为止。
- 如果对话框异常关闭,并且该对话框包含满足上述两个条件之一的按钮,则该对话框将尝试将result属性设置为调用{{3 }}和第一个匹配的result converter。
- 如果由于任何原因结果转换器返回null,或者如果仅存在一个非取消按钮时对话框关闭,则ButtonType属性将为null,并且result方法将返回showAndWait()。稍后,这意味着,如果您使用选项2或选项3(如本类文档的前面所述),则Optional.empty() lambda将永远不会被调用,并且代码将继续执行,就像没有返回对话框一样任何价值。
通常,当使用AlertType.CONFIRMATION
时,已经有一个取消按钮。但是,您将在Alert
的构造函数中声明自己的按钮,该构造函数将覆盖默认按钮。
Optional.ifPresent(java.util.function.Consumer)的Javadoc:
...
通过传递可变数量的ButtonType参数,开发人员将直接覆盖将在对话框中显示的默认按钮,将预定义按钮替换为varargs数组中指定的任何内容。
...
您的按钮都不是取消按钮。由于您未指定ButtonData
,所以它们都具有ButtonBar.ButtonData.OTHER
。