JavaFX如何检查2个可观察值并运行代码(如果它们符合条件)以及如何从自定义jfx窗口获取一对值
问题描述:
我有非常简单的从javafx对话框集合更改密码的窗口 - 我使用自定义对话框示例来构建它(http://code.makery.ch/blog/javafx-dialogs-official/)。问题用粗体显示在下面的代码中:JavaFX如何检查2个可观察值并运行代码(如果它们符合条件)以及如何从自定义jfx窗口获取一对值
Dialog<Pair<String, String>> dialog = new Dialog<>();
dialog.setTitle("Password change");
ButtonType ButtonTypeSavePassword = new ButtonType("Save",
ButtonBar.ButtonData.OK_DONE);
ButtonType ButtonTypeCancel = new ButtonType("Cancel",
ButtonBar.ButtonData.CANCEL_CLOSE);
//dialog.getDialogPane().getButtonTypes().addAll(loginButtonType,
ButtonType.CANCEL);
// Create the username and password labels and fields.
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
PasswordField pass1 = new PasswordField();
PasswordField pass2 = new PasswordField();
grid.add(new Label("Enter new password"), 0, 0);
grid.add(pass1, 1, 0);
grid.add(new Label("Re-enter new password "), 0, 1);
grid.add(pass2, 1, 1);
Node saveButton =
dialog.getDialogPane().lookupButton(ButtonTypeSavePassword);
saveButton.setDisable(true);
Platform.runLater(() -> pass1.requestFocus());
// ???如何用lambda表达式一次检查两个可观察值(如果pass1.length> 0且pass2.length> 0)并更改saveButton以启用?
dialog.setResultConverter(dialogButton -> {
if (dialogButton == ButtonTypeSavePassword) {
return new Pair<>(pass1.getText(), pass2.getText());
}
return null;
});
Optional<Pair<String, String>> result = dialog.showAndWait();
result.ifPresent(usernamePassword ->
{
System.out.println("Username=" + usernamePassword.getKey() + ",
Password=" + usernamePassword.getValue());
});
// ???我怎样才能把这对数值放到定制对话框JFX窗口外部定义的2个字符串中(而不是象上面那样系统出来)?
答
如何使用lambda表达式一次检查两个可观察值(如果pass1.length> 0且pass2.length> 0)并更改saveButton以启用?
您可以通过多种方式来做到这一点。
随着这两个密码字段监听器:
saveButton.setDisable(true);
ChangeListener<String> passwordListener = (obs, oldPW, newPW) ->
saveButton.setDisable(pass1.getText().isEmpty() || pass2.getText().isEmpty());
pass1.textProperty().addListener(passwordListener);
pass2.textProperty().addListener(passwordListener);
还是有约束力的,您可以用Bindings.length(...)
做到:
saveButton.disableProperty().bind(
Bindings.length(pass1.textProperty()).isEqualTo(0)
.or(Bindings.length(pass2.textProperty()).isEqualTo(0))
);
或Bindings.createBooleanBinding()
:
saveButton.disableProperty().bind(Bindings.createBooleanBinding(() ->
pass1.getText().isEmpty() || pass2.getText().isEmpty(),
pass1.textProperty(), pass2.textProperty()));
(还有其他的选择)。
如何将对中的值放入定义在自定义对话框JFX窗口之外的2个字符串(而不是如上所述的系统输出)?
首先,请不要将多个问题合并为一个帖子。这让其他用户更难找到可能已经被问到的问题的答案。
这里的含义并不十分清楚。你可以只定义在类中,你想要的任何物体的setUsername(...)
和setPassword(...)
方法来传递数据,并调用这些方法:
someOtherThing.setUsername(usernamePassword.getKey());
someOtherThing.setPassword(usernamePassword.getValue());
James_D - 非常感谢你对工作的解决方案 - 它很容易,现在明白了: )。我是否应该将问题分成2个帖子,以便将来可以轻松找到其他用户? – Mic