JavaFX sin bloqueos de diálogo para procesar resultado cuando se hace clic en OK

votos
-1

Una discusión más de una pregunta. La respuesta podría ser simplemente Sí, a menos que haya otros enfoques posibles o son mejores.

Lo que suele ser el enfoque para un diálogo no bloqueo que tiene que hacer un trabajo después de hacer clic en OK?

Un diálogo de bloqueo puede devolver el resultado.

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


Estaba pensando en el fin de cambiar mi diseño de diálogo de bloqueo a no-bloqueo, pude poner en práctica un ActionEvent dentro de mi diálogo que hace el trabajo y ponerlo en el botón Aceptar onAction.

Es que el mejor enfoque? No creo que haya ningún otro enfoque, teniendo en cuenta que onClosingEvent no tiene manera de saber qué botón se hizo clic (OK o Cancelar).

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


Tal vez sería mejor conseguir en el botón Aceptar del diálogo en el que haya una instancia, y añadir el ActionEvent allí. De esta manera se puede utilizar tanto showAndWait () y show (). Si el ActionEvent estaba dentro del diálogo, entonces el showAndWait regresó resultado sería redundante ya no es necesario o cualquier utilizable.

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


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

JavaFX diálogos son modales por defecto (se puede cambiar esto a través de la API initModality (javafx.stage.Modality)). Para especificar si desea bloquear o diálogos sin bloqueo, los desarrolladores sólo tienen que elegir a llamar showAndWait () o Mostrar () (respectivamente). Por defecto, la mayoría los desarrolladores deben optar por utilizar showAndWait (), dada la facilidad de codificación en estas situaciones. A continuación se muestra tres fragmentos de código, que muestran tres formas igualmente válidas de mostrar un cuadro de diálogo:


ACTUALIZACIÓN 07/02/2019

En el trabajo con JFoenix JFXDialog que sólo es no bloqueante He intentado usar CompletableFuture para esperar el resultado.

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

El CompletableFuture se crea cuando creo mi JFXDialog, y luego regresó. Los botones Aceptar y Cancelar en el cuadro de diálogo es o bien llamando a la resultFuture.cancel o resultFuture.complete

Publicado el 19/12/2018 a las 14:19
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Una opción sería la de escuchar la resultpropiedad.

Una propiedad que representa lo que se ha vuelto del diálogo. Un resultado se genera a través del convertidor de resultado , que está destinada a convertir de la ButtonTypeque el usuario ha hecho clic en en un valor de tipo R. Consulte la Dialogclase Javadoc para más detalles.

Si el tipo de resultado de los Dialoges ButtonType(como cuando se usa una Alert), entonces usted sabrá qué botón se presiona directamente. De lo contrario, el convertidor resultado es responsable de determinar el resultado en base a lo que se pulsa el botón. Esto significa que puede combinar un convertidor resultado con escuchar el resultado de hacer lo apropiado cuando el resultado se establece.

Respondida el 19/12/2018 a las 16:08
fuente por usuario

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