java dialog 关闭_按OK按钮后如何使JavaFX Dialog不关闭

目前我正在使用 Dialog loginDialog = new Dialog<>(); 创建一个登录对话框,用户需要在其中输入用户名和密码,然后单击“确定”按钮进行登录 .

我的问题

不幸的是,无论登录是否成功,每次按下确定按钮时对话窗格都会自动关闭 . 我希望对话框窗格仅在按下取消按钮或登录成功时自行关闭 .

解决方案

正如NwDX指出的那样 . 需要使用addEventFilter方法 . 我的实现看起来像这样:

btnLogin.addEventFilter(ActionEvent.ACTION, event -> {

if (!comboAdministrator.getValue().getPassword().equals(pfLogin.getText())) {

lblErrorNotification.setText("Password is incorrect. Try again!");

pfLogin.requestFocus();

event.consume();

}

});

Explanation :eventfilter捕获任何不匹配的密码,并向标签节点发送错误消息以进行通知 . event.consume()是必要的,否则对话框将通过再次关闭自身而恢复其原始行为 .

具有完整代码的解决方案

private Optional showLoginDialog() {

Dialog dialog = new Dialog<>();

dialog.setTitle("Administrator Login");

dialog.setHeaderText("Enter administrator password");

dialog.initOwner(btnShowManagerView.getScene().getWindow());

dialog.getDialogPane().getStylesheets().add("util/resources/myCSS.css");

dialog.setGraphic(new ImageView(ResourceClass.class.getResource("locker.png").toString()));

ButtonType loginButtonType = new ButtonType("Login", ButtonData.YES);

ButtonType cancelButtonType = ButtonType.CANCEL;

dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, cancelButtonType);

Label lblErrorNotification = new Label();

lblErrorNotification.setTextFill(Color.RED);

GridPane gridPane = new GridPane();

gridPane.setHgap(10);

gridPane.setVgap(10);

gridPane.setPadding(new Insets(20, 150, 20, 20));

ComboBox comboAdministrator = new ComboBox();

comboAdministrator.setItems(main.getAdministrators());

comboAdministrator.setValue(main.getAdministrators().get(0));

comboAdministrator.setConverter(new StringConverter() {

@Override

public String toString(User object) {

return object.getLoginName();

}

@Override

public User fromString(String string) {

return null;

}

});

main.enableComboBoxBaseShowIfFocused(comboAdministrator);

PasswordField pfLogin = new PasswordField();

gridPane.add(new Label("AdminUser"), 0, 0);

gridPane.add(comboAdministrator, 1, 0);

gridPane.add(new Label("Password"), 0, 1);

gridPane.add(pfLogin, 1, 1);

gridPane.add(lblErrorNotification, 1, 2);

Button btnLogin = (Button) dialog.getDialogPane().lookupButton(loginButtonType);

btnLogin.addEventFilter(ActionEvent.ACTION, event -> {

if (!comboAdministrator.getValue().getPassword().equals(pfLogin.getText())) {

lblErrorNotification.setText("Password is incorrect. Try again!");

pfLogin.requestFocus();

event.consume();

}

});

btnLogin.disableProperty()

.bind(pfLogin.textProperty().isEmpty());

dialog.getDialogPane().setContent(gridPane);

Platform.runLater(()

-> comboAdministrator.requestFocus());

dialog.setResultConverter((ButtonType buttonType) -> {

if (buttonType == loginButtonType) {

return comboAdministrator.getValue();

}

return null;

});

return dialog.showAndWait();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值