Boa tarde,
Desenvolvi um sistema para PDV, que já esta rodando em alguns clientes, mas tem uma situação que não está me agradando.
O sistema todo é baseado em comandos que o usuário pode executar em um textField. Ai conforme o comando, eu valido o onKeyPressed, e chamo os métodos para cada situação, conforme abaixo. É apenas um exemplo
this.textFieldComando.setOnKeyPressed(event -> {
if (event.getCode().equals(KeyCode.ENTER)) {
Platform.runLater(() -> {
iniciarOperacaoCartaoSitef();
});
return;
}
});
Nesse caso, supondo que o usuário teclou enter, eu inicio a transação do cartão, utilizando o Sitef Dedicado.
Como tenho que ficar mostrando várias mensagens que o Sitef vai me passando, esse método iniciarOperacaoCartaoSitef, é executando dentro de um Service.
Service<Boolean> cartaoService = new Service<Boolean>() {
Esse service, fica executando um while (Estrutura do Sitef), que fica me retornando qual o estado atual da transacao. Em um determinado momento, ele me retorna uma mensagem por exemplo, de cartão sem saldo. Nesse momento, eu gostaria de apresentar ao usuário a mensagem em um Alert, e "forçar" o sistema a esperar o ok, que seria usando o seguinte código:
Alert dialogoInfo = new Alert(Alert.AlertType.INFORMATION);
dialogoInfo.setTitle("Aviso");
dialogoInfo.setHeaderText("");
dialogoInfo.setContentText(retornoSitef.getBuffer());
dialogoInfo.showAndWait();
Mas como sabemos, como está dentro de um service em outra thread, o JavaFX retorna uma exceção:
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-187
Para evitar isso, tenho usado:
JOptionPane.showMessageDialog(null, retornoSitef.getBuffer());
Mas que acaba me trazendo outros problemas, por não conseguir(ou não saber) controlar, forçar a janela do Swing a ficar na frente
Enfim, espero ter conseguido explicar o problema, para que algum amigo possa me ajudar.
Abraço