禁用 javafx 警报的移动
Disable movement of a javafx alert
我的 "Do you want to quit" 界面有问题。
从今天开始,我可以将警报框移动到我想要更改的位置 - 最好将警报固定在设定位置(在屏幕中间)。
此警报能够四处移动的问题在于,在具有多个屏幕的设置中,您可以将其移动到任何您想要的位置(在游戏界面之外 f.e。)。
Button btExit = new Button("Exit Game");
btExit.setMinWidth(100);
buttonGrid.add(btExit, 0, 5);
btExit.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("");
alert.initModality(Modality.APPLICATION_MODAL);
alert.initOwner(primaryStage);
alert.setHeaderText("Quit Game");
alert.setContentText("Are you sure?");
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
System.exit(1);
}else
{
alert.close();
}
}
});
如果你想阻止用户移动对话框,只需将样式设置为 UNDECORATED
即可删除用户可以用来在警报周围移动的 window 边框(以及x 按钮,但用户有关闭对话框的替代方法):
@Override
public void start(Stage primaryStage) {
Button btn = new Button("Show alert");
btn.setOnAction((ActionEvent event) -> {
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.getDialogPane().setStyle("-fx-border-color: black;");
alert.initModality(Modality.APPLICATION_MODAL);
alert.initStyle(StageStyle.UNDECORATED);
alert.initOwner(primaryStage);
alert.setHeaderText("Quit Game");
alert.setContentText("Are you sure?");
Optional<ButtonType> result = alert.showAndWait();
if (result.orElse(null) == ButtonType.OK) {
Platform.exit();
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
我在这里做的一些其他修改:
替换
System.exit(1);
和
Platform.exit();
更优雅地关闭应用程序。毕竟1
状态码表示异常终止.
删除
else
{
alert.close();
}
这从来都不是必需的,因为 showAndWait
只有 returns 在 Alert
关闭之后...
二手
result.orElse(null)
即使 Optional
为空,也能无错误地检索值(不能 100% 确定在这种情况下会发生这种情况,但这样做并没有什么坏处)。
我的 "Do you want to quit" 界面有问题。
从今天开始,我可以将警报框移动到我想要更改的位置 - 最好将警报固定在设定位置(在屏幕中间)。
此警报能够四处移动的问题在于,在具有多个屏幕的设置中,您可以将其移动到任何您想要的位置(在游戏界面之外 f.e。)。
Button btExit = new Button("Exit Game");
btExit.setMinWidth(100);
buttonGrid.add(btExit, 0, 5);
btExit.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("");
alert.initModality(Modality.APPLICATION_MODAL);
alert.initOwner(primaryStage);
alert.setHeaderText("Quit Game");
alert.setContentText("Are you sure?");
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
System.exit(1);
}else
{
alert.close();
}
}
});
如果你想阻止用户移动对话框,只需将样式设置为 UNDECORATED
即可删除用户可以用来在警报周围移动的 window 边框(以及x 按钮,但用户有关闭对话框的替代方法):
@Override
public void start(Stage primaryStage) {
Button btn = new Button("Show alert");
btn.setOnAction((ActionEvent event) -> {
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.getDialogPane().setStyle("-fx-border-color: black;");
alert.initModality(Modality.APPLICATION_MODAL);
alert.initStyle(StageStyle.UNDECORATED);
alert.initOwner(primaryStage);
alert.setHeaderText("Quit Game");
alert.setContentText("Are you sure?");
Optional<ButtonType> result = alert.showAndWait();
if (result.orElse(null) == ButtonType.OK) {
Platform.exit();
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
我在这里做的一些其他修改:
替换
System.exit(1);
和
Platform.exit();
更优雅地关闭应用程序。毕竟
1
状态码表示异常终止.删除
else { alert.close(); }
这从来都不是必需的,因为
showAndWait
只有 returns 在Alert
关闭之后...二手
result.orElse(null)
即使
Optional
为空,也能无错误地检索值(不能 100% 确定在这种情况下会发生这种情况,但这样做并没有什么坏处)。