ProgressBar using JavaFX

1

I have a method that reads multiple files and generates a report for each file read. How do I get the time for each service and show on ProgressBar ? Do I have to use Thread or Task ?

I tried to do this:

public void pegarArquivo(ActionEvent event) {
        Service<Void> servico = new Service() {
            @Override
            protected Task createTask() {
                return new Task() {
                    @Override
                    protected Void call() throws Exception {
                        updateMessage("Carregando...");
                        Thread.sleep(300);

                        // TODO add your handling code here:
                        JFileChooser chooser = new JFileChooser();
                        // Possibilita a seleção de vários arquivos
                        chooser.setMultiSelectionEnabled(true);
                        // Apresenta a caixa de diálogo
                        chooser.showOpenDialog(null);
                        //ListaAuxiliar <----------------
                        List<List> listaAuxiliar = new ArrayList<List>();
                        // Retorna os arquivos selecionados. Este método retorna vazio se
                        // o modo de múltipla seleção de arquivos não estiver ativada.
                        File[] files = chooser.getSelectedFiles();
                        for (File argumento : files) {
                            System.err.println("Argumentos: " + argumento.getPath());
                            caminho = argumento.getPath();
                            LeitorXmlCabecalho leitorCabecalho = new LeitorXmlCabecalho();
                            LeitorXmlGlosaLote leitorGlosa = new LeitorXmlGlosaLote();
                            LeitorXmlLote leitorLote = new LeitorXmlLote();
                            LeitorXmlPagamento leitorPagamento = new LeitorXmlPagamento();
                            LeitorXmlPagamentoLista leitorListaPagamento = new LeitorXmlPagamentoLista();
                            try {
                                listaContatosPL = (ArrayList<UnimedPagamentoLista>) leitorListaPagamento.realizaLeituraXML(caminho);
                                listaContatoslt = leitorLote.realizaLeituraXML(caminho);
                                listaGlosa = leitorGlosa.realizaLeituraXML(caminho);
                                pagamento = leitorPagamento.realizaLeituraXML(caminho);
                                cabecalho = leitorCabecalho.realizaLeituraXML(caminho);
                                listaCabecalho.add(cabecalho);
                                listaPagamento.add(pagamento);

                                listaAuxiliar.add(listaContatoslt);
                                String dd = argumento.getName();
                                ListarArquivo arq = new ListarArquivo();
                                arq.setArquivo(dd);
                                listaA.add(arq);
                                System.out.println("Lista: " + listaA.get(nRel).getArquivo());
                            } catch (ParserConfigurationException e) {
                                System.out.println("O parser não foi configurado corretamente.");
                                e.printStackTrace();
                            } catch (SAXException e) {
                                System.out.println("Problema ao fazer o parse do arquivo.");
                                JOptionPane.showMessageDialog(null, "Formato do Arquivo incorreto!: \n" + e, "ERRO!", JOptionPane.ERROR_MESSAGE);
                                e.printStackTrace();
                            } catch (IOException e) {
                                System.out.println("O arquivo não pode ser lido.");
                                JOptionPane.showMessageDialog(null, "Arquivo não pode ser lido!: \n" + e, "ERRO!", JOptionPane.ERROR_MESSAGE);
                                e.printStackTrace();
                            }
                            atualizar();
                            for (List<UnimedLote> lst : listaAuxiliar) {

                                String nomePrestador = listaCabecalho.get(nRel).getNomePrestador();

                                String[] as = nomePrestador.split("/");
                                nomePrestador = as[0];

                                RelatorioExcel r = new RelatorioExcel();
                                String dataSistema = dataSistema();
                                nomeArquivo = nomePrestador + "_" + dataSistema + "_" + nRel;
                                codArquivoPrestador = listaCabecalho.get(nRel).getCodigoPrestador();
                                caminhoExcel = r.geraExcell(listaPagamento.get(nRel), listaContatosPL, listaCabecalho.get(nRel),
                                        nomeArquivo, lst, listaGlosa);

                            }
                            codPrestador = Long.parseLong(codArquivoPrestador);
                            boolean arquivoSalvo = salvarArquivos(caminhoExcel, ext, nomeArquivo, codPrestador);
                            if (arquivoSalvo) {
                                System.out.println("SUCESSO");
                            } else if (!arquivoSalvo) {
                                System.out.println("Erro");
                            }

                            nRel++;
                        }
                        updateProgress(1, nRel);
                        for (int i = 0; i < nRel; i++) {
                            updateProgress(i + 1, nRel);
                            updateMessage("Carregando " + (i + 1) + " de " + nRel);
                            Thread.sleep(300);
                        }
                        updateMessage("Terminou");
                        return null;
                    }
                };
            }
        };
        status.textProperty().bind(servico.messageProperty());
        barra.progressProperty().bind(servico.progressProperty());
        //precisa inicializar o Service
        servico.restart();
    }

But the progress of the bar only begins after the entire process is over. And this exception still happens:

WARNING: Uncaught throwable in javafx concurrent thread pool
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
    
asked by anonymous 27.05.2015 / 15:39

1 answer

1

I answered a similar question, take a look.

ProgressBar loading according to JavaFX Process time

What you need to upgrade is to do the following line:

progressBar.progressProperty().bind(service.progressProperty());

On the thread and task question, you have to use one of the javafx classes: link

In your case, just a Task.

    
23.08.2015 / 14:20