1
I have a method that reads multiple files and generates a report for each file read. How do I take the time of each service and show on ProgressBar
? I have to use Thread
or Task
?
I tried to do it that way:
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 starts after the whole process is over. And yet this exception happens:
WARNING: Uncaught throwable in javafx concurrent thread pool
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
Thank you for the answer but I have already solved the problem in the way you put it, but I will mark your answer as correct because I forgot to answer it
– DiegoAugusto