Dúvida na atualização de um JTable

3 respostas
EdmiltonN

Estou tentando atualizar uma JTable e não entendo o motivo de não dar certo… em uma parte do meu programa onde eu atualizo por meio de um clique em um botão dá tudo certo… mas em outra parte onde eu quero simular um caminho feito em uma matriz utilizando um JTable não dá… e o curioso é q a JTable é atualizada se eu colocar um JOptionPane.showMessageDialog() pra abrir a cada célula atualizada… mas se eu tiro o JOptionPane, não atualiza de jeito nenhum…

Segue o trecho de código… se alguém puder me ajudar, fico grato!!

matriz[automato.getColuna()][automato.getLinha()] = getCacador();

for(int i = 0; i < tela.getCOLUNAS(); i++)

____tela.getTabela().getColumnModel().getColumn(i).setCellRenderer(new CellRenderer(matriz));
matriz[ultimaColuna][ultimaLinha] = 0;

for(int i = 0; i < tela.getCOLUNAS(); i++)

____tela.getTabela().getColumnModel().getColumn(i).setCellRenderer(new CellRenderer(matriz));

atualizaMapa();

try {

____Thread.sleep(100);

} catch(InterruptedException e) {

____e.printStackTrace();

}

JOptionPane.showMessageDialog(null, “Atualiza: L”+automato.getLinha()+" C"+automato.getColuna());

a última linha é o JOptionPane que eu falei… :lol:

3 Respostas

ViniGodoy

Esse seu outro trecho de código, que atualiza a matriz, está rodando de outra thread?
Você está atualizando os valores da tela através do TableModel e dando um FireTableRowsUpdated?

EdmiltonN

Não, não… não tá rodando de outra thread não, eu coloquei Thread.sleep por que eu quero parar o programar pra ser executado pouco a pouco pra dar um efeito visual… não sei outro meio de parar o código sem ser desse jeito…

E o método atualizaMapa() segue abaixo…

public void atualizaMapa() {

____for(int i = 0; i < tela.getLINHAS(); i++)

________for(int j = 0; j < tela.getCOLUNAS(); j++)

____________tela.getModelo().fireTableCellUpdated(i, j);

}
ViniGodoy

Então é esse o problema.

Todas as ações de botões do Swing rodam na thread da AWT. Essa é a mesma thread que faz a pintura da janela. Se você põe um processamento qualquer muito longo (ou lento, graças ao Thread.sleep), esse processamento terá que terminar, para depois ir para o método de pintura fazer seu trabalho.

A solução para o seu problema é criar uma segunda thread, que rode o seu código, liberando o Swing para continuar a pintura dele.
Se você está usando java 6, pesquisa sobre a classe SwingWorker. Caso contrário, dê uma olhada em como criar threads com a classe Thread.

Criado 29 de setembro de 2007
Ultima resposta 1 de out. de 2007
Respostas 3
Participantes 2