JavaFX nicht blockierenden Dialog Ergebnis zu verarbeiten, wenn Ok geklickt

stimmen
-1

Eine Diskussion mehr als eine Frage. Die Antwort könnte einfach Ja, es sei denn es andere Ansätze möglich ist, oder besser sind.

Was ist in der Regel der Ansatz für einen nicht blockierenden Dialog, der einige Arbeiten nach dem Klicken auf OK tun muss?

Für ein Sperr Dialog kann das Ergebnis zurück.

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


Ich dachte , um ein Blockieren zu non-blocking meinen Dialog Design zu ändern, konnte ich eine Action in meinem Dialog implementieren , die die Arbeit macht und auf die OK - Taste onAction eingestellt.

Ist das der beste Ansatz? Ich glaube nicht , dass es anderer Ansatz ist, wenn man bedenkt , dass onClosingEvent nicht weiß , hat die Schaltfläche geklickt wurde (OK oder Abbrechen).

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


Vielleicht wäre es besser, die OK-Taste im Dialog zu gelangen, wo Sie es instanziiert haben, und die Action dort hinzuzufügen. Auf diese Weise können beide showAndWait () und zeigen können (). Wenn die Action im Dialog war, dann kehrte die showAndWait Ergebnis überflüssig wäre nicht mehr erforderlich oder jede verwendbar.

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


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

JavaFX Dialoge sind modal standardmäßig (Sie dies über die initModality (javafx.stage.Modality) API ändern können). Um festzulegen, ob Sie blockieren oder nicht-blockierende Dialoge, wählen Entwickler einfach showAndWait () oder show () (jeweils) zu nennen. Standardmäßig sollten die meisten Entwickler wählen showAndWait (), angesichts der Einfachheit der Codierung in diesen Situationen zu verwenden. Unten gezeigt wird drei Code-Schnipsel, zeigt drei gleichwertigen Möglichkeiten, einen Dialog zeigt:


UPDATE 2019.07.02

mit JFoenix JFXDialog Bei der Arbeit ist die nicht-blockierende nur ich unter Verwendung der CompletableFuture versucht, das Ergebnis zu erwarten.

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

Die CompletableFuture erstellt wird, wo ich meine JFXDialog schaffen, kehrt dann zurück. Die Schaltflächen OK und Abbrechen im Dialog wird entweder den Aufruf der resultFuture.cancel oder resultFuture.complete

Veröffentlicht am 19/12/2018 um 14:19
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Eine Möglichkeit wäre, auf die hören resultEigenschaft.

Eine Eigenschaft darstellt , was aus dem Dialog zurückgegeben wurde. Ein Ergebnis wird durch das erzeugte Ergebnis - Wandler , der von der umwandeln soll , ButtonTypedass der Benutzer auf in einen Wert vom Typ R. zum Lesen geklickt , Dialogum weitere Informationen Klasse JavaDoc.

Wenn der Ergebnistyp der Dialogheißt ButtonType(wie wenn eine Verwendung Alert) , dann werden Sie wissen , welche Taste direkt gedrückt wird. Andernfalls ist das Ergebnis Konverter verantwortlich für das Ergebnis der Bestimmung basierend auf welcher Taste gedrückt wird. Das bedeutet , dass Sie ein Ergebnis Konverter mit dem Hören zu dem Ergebnis , kombinieren die entsprechende Sache zu tun , wenn das Ergebnis festgelegt ist.

Beantwortet am 19/12/2018 um 16:08
quelle vom benutzer

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