JavaFX Dialog non-blocage pour résultat traiter lorsque Ok cliqué

voix
-1

Une discussion plus d'une question. La réponse pourrait être simplement Oui, à moins que d'autres approches possibles ou mieux.

Ce qui est généralement l'approche d'un dialogue non bloquant qui a besoin de faire un travail après avoir cliqué sur OK?

Une boîte de dialogue de blocage peut renvoyer le résultat.

Optional<ButtonType> result = dialog.showAndWait();


Je pensais pour changer ma conception de dialogue de bloquer à la non-blocage, je pourrais mettre en œuvre un ActionEvent dans mon dialogue qui fait le travail et réglez - le sur le bouton OK onAction.

Est - ce que la meilleure approche? Je ne pense pas qu'il y ait toute autre approche, étant donné que onClosingEvent n'a aucun moyen de savoir quel bouton a été cliqué (OK ou Annuler).

getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
final Button okButton = (Button) getDialogPane().lookupButton(ButtonType.OK);
okButton.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        //Do the work that normally would be done outside of the Dialog on returned Optional<ButtonType>
    }
});


Peut-être qu'il serait préférable d'obtenir le bouton Ok de la boîte de dialogue où vous avez instancié, et ajoutez le ActionEvent là. De cette façon, vous pouvez utiliser les deux showAndWait () et show (). Si la ActionEvent était dans le dialogue, le résultat retourné showAndWait serait redondant plus nécessaire ou tout utilisable.

MyDialog dialog = new Dialog();
Button okButton = dialog.getOkButton();
okButton.setOnAction();


https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Dialog.html

les boîtes de dialogue JavaFX sont modales par défaut (vous pouvez modifier ce via l'API initModality (javafx.stage.Modality)). Pour spécifier si vous souhaitez bloquer ou les boîtes de dialogue non bloquant, les développeurs choisissent simplement d'appeler showAndWait () ou show () (respectivement). Par défaut, la plupart des développeurs devraient choisir d'utiliser showAndWait (), compte tenu de la facilité de codage dans ces situations. Ci-dessous, trois extraits de code, montrant trois façons tout aussi valides de montrer une boîte de dialogue:


Mise à jour 02/07/2019

En travaillant avec JFoenix JFXDialog qui est que je non bloquante essayé d'utiliser CompletableFuture d'attendre le résultat.

final CompletableFuture<String> resultFuture = createDialog();
final String result = resultFuture.get(); // This could be placed in a Task<Void> to keep it non-blocking.

public CompletableFuture<String> createDialog() {
    final CompletableFuture<String> messageFuture = new CompletableFuture<>();

    okButton.setOnAction(event -> {
        messageFuture.complete(textField.getText());
        dialog.close();
    });

    return messageFuture;
}

Le CompletableFuture est créé où je crée mon JFXDialog, puis retourné. Les boutons OK et sur la boîte de dialogue ANNULER est soit en appelant le resultFuture.cancel ou resultFuture.complete

Créé 19/12/2018 à 14:19
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Une option serait d'écouter la resultpropriété.

Une propriété qui représente ce qui a été renvoyé de la boîte de dialogue. Un résultat est généré par le convertisseur de résultat , qui est destiné à convertir la ButtonTypeque l'utilisateur a cliqué sur dans une valeur de type R. Reportez - vous à la DialogJavaDoc de classe pour plus de détails.

Si le type de résultat Dialogest - ButtonType( par exemple lorsque vous utilisez un Alert), vous saurez ce que le bouton est pressé directement. Dans le cas contraire, le convertisseur de résultat est chargé de déterminer le résultat en fonction de ce bouton est enfoncé. Cela signifie que vous pouvez combiner un convertisseur de résultat à l' écoute du résultat de faire la chose appropriée lorsque le résultat est réglé.

Créé 19/12/2018 à 16:08
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more