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()); 
+0

James_D - 非常感谢你对工作的解决方案 - 它很容易,现在明白了: )。我是否应该将问题分成2个帖子,以便将来可以轻松找到其他用户? – Mic