JavaFX Non-Blocking Dialog przetwarzać rezultat gdy Ok kliknięciu

głosy
-1

Dyskusja więcej niż pytanie. Odpowiedź może być po prostu tak, o ile nie jest to możliwe, lub inne metody są lepsze.

Co jest zwykle podejście do non oknie blokującym, który musi popracować po kliknięciu OK?

Dialogowe blokowanie może zwrócić wynik.

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


Myślałam, aby zmienić swój wygląd dialogowe zablokowaniu nieblokującą mogłem realizować ActionEvent w moim oknie dialogowym, które działa i ustawić go przyciskiem OK onAction.

Jest to, że najlepszym podejściem? Nie sądzę, że istnieją inne podejście, biorąc pod uwagę, że onClosingEvent ma możliwości dowiedzenia się, który przycisk został kliknięty (OK lub Anuluj).

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


Być może byłoby lepiej, aby uzyskać przycisk OK w oknie gdzie masz instancja je i dodać tam ActionEvent. W ten sposób można używać zarówno showAndWait () i show (). Jeśli ActionEvent był w oknie dialogowym, a następnie showAndWait zwrócony wynik byłby zbędny zbędny lub dowolny użyteczny.

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


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

dialogi JavaFX modalne są domyślnie (można to zmienić poprzez initModality (javafx.stage.Modality) API). Aby określić, czy chcesz blokowania lub non-blocking dialogi, deweloperzy po prostu wybrać, aby zadzwonić showAndWait () lub show () (odpowiednio). Domyślnie większość deweloperzy powinni zdecydować się na stosowanie showAndWait (), ze względu na łatwość kodowania w takich sytuacjach. Poniżej znajdują się trzy fragmenty kodu, pokazując trzy równie ważne sposoby pokazując okno:


UPDATE 02.07.2019

W pracy z JFoenix JFXDialog który jest tylko non-blocking Próbowałem, używając CompletableFuture poczekać na wynik.

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

CompletableFuture jest tworzony gdzie tworzę JFXDialog, po czym wrócił. OK i Anuluj w oknie dialogowym jest albo wywołując resultFuture.cancel lub resultFuture.complete

Utwórz 19/12/2018 o 14:19
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Jedną z możliwości byłoby słuchać resultnieruchomości.

Właściwość reprezentujący co zostało zwrócone z okna. Rezultatem są generowane przez konwerter wynik , który jest przeznaczony do konwersji od ButtonTypeże użytkownik kliknął na wartość typu R. odnoszą się do DialogJavaDoc klasy o więcej szczegółów.

Jeśli typ wynikiem DialogIs ButtonType(takie jak przy używaniu Alert), wtedy będziesz wiedział, co naciśnięciu przycisku bezpośrednio. W przeciwnym razie przetwornica wynik jest odpowiedzialny za ustalanie wyniku w oparciu o to, co naciśnięciu przycisku. Oznacza to, że można połączyć konwertera wynik z słuchania do rezultatu, który wykonuje odpowiednie, gdy wynik jest ustawiony.

Odpowiedział 19/12/2018 o 16:08
źródło użytkownik

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