目前我正在使用 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();
}