JavaFX sem bloqueio de diálogo para processar resultado quando Ok clicado

votos
-1

Uma discussão mais do que uma pergunta. A resposta poderia ser simplesmente Sim, a menos que haja outras abordagens possíveis ou são melhores.

O que geralmente é a abordagem para um diálogo sem bloqueio que precisa fazer algum trabalho depois de clicar OK?

Uma caixa de diálogo de bloqueio pode retornar o resultado.

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


Eu estava pensando, a fim de mudar a minha concepção de diálogo do bloqueio para o non-blocking, eu poderia implementar um ActionEvent dentro do meu diálogo que faz o trabalho e configurá-lo para o onAction botão OK.

É que a melhor abordagem? Eu não acho que haja qualquer outra abordagem, considerando que onClosingEvent tem nenhuma maneira de saber qual botão foi clicado (OK ou 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>
    }
});


Talvez seria melhor para obter o botão Ok na caixa de diálogo onde você instanciado-lo e adicionar o ActionEvent lá. Dessa forma, você pode usar tanto showAndWait () e show (). Se o ActionEvent estava dentro da caixa de diálogo, então o showAndWait retornou resultado seria redundante não é mais necessário ou qualquer utilizável.

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


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

diálogos JavaFX são modais por padrão (você pode mudar isso através da API initModality (javafx.stage.Modality)). Para especificar se deseja bloquear ou não bloquear os diálogos, os desenvolvedores simplesmente optar por chamar showAndWait () ou show () (respectivamente). Por padrão a maioria dos desenvolvedores devem optar por usar showAndWait (), dada a facilidade de codificação nestas situações. Mostrado abaixo é três trechos de código, mostrando três maneiras igualmente válidas de apresentação de uma janela:


ATUALIZAÇÃO 2019/07/02

Ao trabalhar com JFoenix JFXDialog que é apenas non-blocking Eu tentei usar CompletableFuture e aguardar o 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;
}

O CompletableFuture é criado onde eu criar o meu JFXDialog, depois voltou. Os botões OK e Cancelar na caixa de diálogo ou está chamando a resultFuture.cancel ou resultFuture.complete

Publicado 19/12/2018 em 14:19
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Uma opção seria a ouvir a resultpropriedade.

Uma propriedade que representa o que foi devolvido a partir do diálogo. Um resultado é gerado através do conversor de resultado , que se destina a converter do ButtonTypeque o usuário clicou em um valor do tipo R. Consulte o DialogJavaDoc classe para obter mais detalhes.

Se o tipo de resultado das Dialogseja ButtonType(como ao usar um Alert), então você saberá o botão é pressionado diretamente. Caso contrário, o conversor resultado é responsável por determinar o resultado com base no que o botão é pressionado. Isso significa que você pode combinar um conversor resultado com a ouvir o resultado para fazer a coisa apropriada quando o resultado está definido.

Respondeu 19/12/2018 em 16:08
fonte usuário

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