2017-05-28 4 views
0

J'ai une fenêtre très simple pour changer le mot de passe de la collection de dialogues javafx - j'utilise un exemple de dialogue personnalisé pour le construire (http://code.makery.ch/blog/javafx-dialogs-official/). Les questions sont en caractères gras dans le code ci-dessous:JavaFX Comment vérifier 2 valeurs observables et exécuter du code si elles correspondent aux conditions, et comment obtenir une paire de valeurs de la fenêtre jfx personnalisée

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

// ??? Comment vérifier deux valeurs observables à la fois (si pass1.length> 0 et pass2.length> 0) avec l'expression lambda et changer saveButton pour activer?

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()); 
    }); 

// ??? Comment puis-je mettre les valeurs de la paire dans 2 chaînes définies en dehors de la fenêtre JFX de la boîte de dialogue personnalisée (pas pour sortir le système comme ci-dessus)?

Répondre

2

Comment vérifier deux valeurs observables à la fois (si pass1.length> 0 et pass2.length> 0) avec l'expression lambda et changer saveButton pour activer?

Vous pouvez le faire de plusieurs façons.

Avec un auditeur sur les deux champs de mot de passe:

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); 

ou avec une liaison, que vous pouvez faire avec Bindings.length(...):

saveButton.disableProperty().bind(
    Bindings.length(pass1.textProperty()).isEqualTo(0) 
    .or(Bindings.length(pass2.textProperty()).isEqualTo(0)) 
); 

ou Bindings.createBooleanBinding():

saveButton.disableProperty().bind(Bindings.createBooleanBinding(() -> 
    pass1.getText().isEmpty() || pass2.getText().isEmpty(), 
    pass1.textProperty(), pass2.textProperty())); 

(et il y a aussi d'autres options). Comment puis-je mettre les valeurs de la paire dans 2 chaînes définies en dehors de la fenêtre JFX de la boîte de dialogue personnalisée (pas pour sortir le système comme ci-dessus)? En premier lieu, veuillez ne pas combiner plusieurs questions en un seul message. Il est plus difficile pour les autres utilisateurs de trouver des réponses aux questions qui ont déjà été posées.

Ce que vous voulez dire ici n'est pas très clair. Vous pouvez simplement définir setUsername(...) et setPassword(...) méthodes dans la classe de tout objet que vous voulez transmettre les données à et appeler ces méthodes:

someOtherThing.setUsername(usernamePassword.getKey()); 
someOtherThing.setPassword(usernamePassword.getValue()); 
+0

James_D - merci beaucoup pour la solution de travail - il est très facile de comprendre maintenant:). Dois-je diviser mes questions en 2 messages pour le rendre facile à trouver pour un autre utilisateur à l'avenir? – Mic