Problemas na EDT

Fazendo um refactoring aqui, caí nesse código que importa de um arquivo .csv salva no BD e exibe numa JTable os dados:

[code]
try { f = new File(fileName2);
final ImportProgress p = new ImportProgress();
p.setVisible(true);
SwingWorker<?, ?> worker = new SwingWorker<Object, Object>(){
@Override
protected Object doInBackground() throws Exception {
DBImport.importNTC(f,Conexao.getConnection());// meu processo demorado
String sql =“SELECT * FROM NTC_MANUTENCAO ORDER BY LOCLZ_CLASS”;//meu select para exibição
try{
tabela.setQuery(sql);
tfTotReg.setText( “” + DBUtils.contaRegistroNTC(Conexao.getConnection())) ;
for(int c=0; c<jTable.getColumnCount(); c++) {
packColumn(jTable, c, 2);
}

		}catch(Exception e){
			JOptionPane.showMessageDialog(null,"Falha na importação!","A Importação de dados falhou!",JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}  			
          return null;
     }
     @Override
     protected void done() {
          p.setVisible(false);
     }
};
worker.execute();

 	 }catch (Exception fileNotFoundException){

JOptionPane.showMessageDialog(null, “Erro ao Ler o Arquivo de Dados!”,“Mensagem de Erro”, JOptionPane.INFORMATION_MESSAGE);
return ;
}[/code]
Ele ás vezes manda uma stack:

Exception in thread “AWT-EventQueue-0” java.util.NoSuchElementException: Vector Enumeration
at java.util.Vector$1.nextElement(Vector.java:305)
at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(BasicTableUI.java:1684)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1634)
at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
at java.awt.Container.layout(Container.java:1421)
at java.awt.Container.doLayout(Container.java:1410)
at java.awt.Container.validateTree(Container.java:1507)
at java.awt.Container.validate(Container.java:1480)
at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:669)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:124)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Mas o curioso é: isso só ocorre com um arquivo pequeno(nem 1MB, 3000 linhas, 20 colunas).Num arquvo com 50000 linhas e mais de 20MB(53 colunas), não trava. :!: >

Eu imagino que você teria de chamar packColumn (que faz a mesma coisa que o packColumn do www.exampledepot.com, eu suponho) usando um SwingUtilities.invokeLater, já que ele tem de executar na thread do Swing, não na thread do seu SwingWorker.

Hum, é verdade(e olhando o código aqui, o packColumn é o mesmo).E eu nem estou certo sobre esse SwingWorker aí… essa ImportProgress é uma ProgressBar que fica aparecendo enquando os dados vão sendo salvos e exibidos na JTable.Mas eu estou curioso pq trava no arquivo menor e não no que é 40x maior.

Ah, algo que não postei: o invokeLater não dá travamento de GUI, mas congela a minha ProgressBar no final da execução(depois sai da execução normalmente).O engraçado é que eu não descobri o motivo de um arquivo tão pequeno travar a GUI e o outro monstro passar em branco.

Algo chato:
além daquele packColumn tenho outras 2,3 chamadas de método que fazem uma atualização na tela.Percebi que o invokeLater permite a atualização da JTable e os Labels, mas trava a ProgressBar por uns 5 segundos legal.Adoraria que o java tivesse um escalonador natural para quando muitos componentes precisassem ser atualizadosem série. :stuck_out_tongue: