JTable sem atualizar quando seleção
Pergunta
Quando eu selecionar uma linha em uma JTable, meu JTable não fica mais atualizado. Quando eu não selecionar uma linha, o código abaixo funciona como esperado. A linha é adicionada ao JTable.
@Override
public void update (Observable arg0, Object arg1)
{
if (arg0 instanceof Logger)
{
LogItem last = systemController.logController.getLog().getLastLogItem();
this.history.add(last);
this.logTableModel.addItem(last);
this.logTable.tableChanged(new TableModelEvent(this.logTableModel));
((DefaultTableModel)this.logTable.getModel()).fireTableStructureChanged();
this.logTable.repaint();
this.logTable.doLayout();
}
}
Quando eu fechar a janela e reabri-lo, eu posso ver a nova linha.
Alguém pode me explicar por que, após selecionar uma linha, eu não vejo nenhuma atualização na JTable mais?
Solução
É o update () acontecer chamada no segmento de eventos Swing? Se não o código terá de ser envolvido com algo como:
SwingUtilities.invokeLater(new Runnable() { public void run() {
logTableModel.addItem(last);
}});
Outras dicas
Há uma série de problemas com o seu código. Você não deveria estar chamando fireTableStructureChanged como isto está relacionado com a estrutura da tabela (não de colunas, etc.) mudança não os próprios dados da tabela (adicionando uma linha, mudando um valor de célula etc). Além disso, você não precisa chamar repaint e doLayout na própria mesa como esta deve ser desencadeada por alterações do modelo.
Eu acho que você deve ter um olhar para como usar tabelas do tutorial Java, especificamente olhar usando modelos de mesa, para ouvir as alterações de dados e disparando eventos de alteração de dados.