Olá, bom tentei implentar uma Thread para gerar relatórios porem não está funcionando continua travando a aplicação, estou fazendo algo errado?
Obrigado.
publicclassThreadRelatorioClientesimplementsRunnable{publicThreadRelatorioClientes(){}@Overridepublicvoidrun(){iniciaCarregar();try{EventQueue.invokeLater(newRunnable(){@Overridepublicvoidrun(){try{newGerar().geraRelatorio("Clientes.jasper","Relatório de Clientes",0);}catch(JRExceptionex){Logger.getLogger(Principal.class.getName()).log(Level.SEVERE,null,ex);}catch(SQLExceptionex){Logger.getLogger(Principal.class.getName()).log(Level.SEVERE,null,ex);}}});}catch(Exceptione){}finally{paraCarregar();}return;}}
O invokeLater não cria nenhuma thread. Ela pega o código de um Runnable e roda na Thread do Swing. Caso você esteja num código de botão (que já está na thread do Swing), uma chamada a invokeLater simplesmente executará o Runnable.
Para criar novas threads, use a classe Thread e o método start().
Dentro da nova thread, aí sim, você usa o invokeLater para alterar o status do que for componente Swing. Mas com certeza essa linha não pode estar num invokeLater:
newGerar().geraRelatorio("Clientes.jasper","Relatório de Clientes",0);
RogerioK
[quote=ViniGodoy]O invokeLater não cria nenhuma thread. Ela pega o código de um Runnable e roda na Thread do Swing. Caso você esteja num código de botão (que já está na thread do Swing), uma chamada a invokeLater simplesmente executará o Runnable.
Para criar novas threads, use a classe Thread e o método start().
Dentro da nova thread, aí sim, você usa o invokeLater para alterar o status do que for componente Swing. Mas com certeza essa linha não pode estar num invokeLater:
newGerar().geraRelatorio("Clientes.jasper","Relatório de Clientes",0);
Você está errando ao chamar aquela linha que indiquei no invokeLater. Isso vai fazer com que essa Thread devolva o processamento para a Thread do Swing e aí, a tela trava.
RogerioK
Consegui, era isso mesmo! estava batendo cabeça aqui há algum tempo! obrigado!
javer
Desculpe mexer nesse assunto ainda, mas gostaria da opinião do ViniGodoy sobre esse meu código que faz algo semelhante. Não tenho certeza sobre a abordagem de gerar o relatório dentro do JDialog está correta.
Tenho esse método que retorna um JDialog com o JViewer dentro dele: