Adicionar/Remover colunas de uma JTable

14 respostas
A

Fala galera!

Estou tendo um problema para gerenciar a adição/remoção de uma coluna dentro de uma JTable. O que acontece é que minha tabela tem que ser dinamicamente acrescentada de linhas e/ou colunas de acordo com o que o usuario quer.

Os problemas começam quando eu excluo e logo depois adiciono uma coluna, vou dar um exemplo para ficar mais claro:

tenho N colunas
deleto uma e fico com N-1 colunas
quando adiciono uma coluna ao invês de ter novamente N colunas eu fico com N+1 colunas.

O que eu acho é que as colunas estão sendo removidas apenas visualmente e quando tento inserir uma coluna ele nunca excluiu aquela ultima coluna no modelo.

ficou muito confuso ou vcs entenderam?

Abaixo foi colocar os códigos de inserção de coluna e remoção:

private void btnInserirColGabActionPerformed(java.awt.event.ActionEvent evt) { DefaultTableModel model = (DefaultTableModel)tabGabaritos.getModel(); model.addColumn(cmbColunas.getSelectedItem()); tabGabaritos.getSelectionModel().setSelectionInterval(0,0); btnExcluirColGab.setEnabled(true); }

private void btnExcluirColGabActionPerformed(java.awt.event.ActionEvent evt) { int[] selecionadas = tabGabaritos.getSelectedColumns(); TableColumnModel modeloColuna = tabGabaritos.getColumnModel(); int tam = selecionadas.length; for (int i = tam - 1; i >= 0; i--) { TableColumn col = modeloColuna.getColumn(selecionadas[i]); modeloColuna.removeColumn(col); } if (tabGabaritos.getColumnModel().getColumnCount() > 1) { tabGabaritos.getColumnModel().getSelectionModel().setSelectionInterval(0,0); } else { btnExcluirColGab.setEnabled(false); } }

Espero a resposta galera!
Um abraço!

14 Respostas

A

Ninguém sabe oq pode estar acontencendo?!

A

estou revivendo este tópico pq ainda n achei uma solução. Se alguem puder sugerir algo.

V

Depois de adicionar a coluna faça:
seuTableModel.fireTableStructureChanged();

A

Valeu por ter respondido Vini. Porém não funcionou… Continuou com o problema… =P

O que pode ser isso?

R

Já tentou usar o AbstractTableModel?

M

Não dá erro?
Você está fazendo n = n-1 quando remove?? ou n+ 1 quando adiciona?

V

Apoiado. O DefaultTableModel só serve para a Sun mostrar exemplos simples.

Tem um ótimos tutoriais sobre como criar um TableModel de verdade, filho de AbstractTableModel:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

Isso torna o código mais modular, limpo e orientado a objetos.

R

Isso ai, e não se intimide não, o AbstractModel assusta mas é bem mais simples do que parece. Alias, tenho usado os models para tudo, meus list, combobox etc nunca mais foram os mesmos uahuahua 8)

L

Para quem quiser…achei uma solução sem usar esse AbstractModel…

Em vez de usar essa linha para adicionar como citado na dúvida anteriormente,

DefaultTableModel model = (DefaultTableModel)tabGabaritos.getModel();  
   model.addColumn(cmbColunas.getSelectedItem());

adicione uma coluna através do columnModel e não pelo model direto aí dá certo ao adicionar novamente, ele vai adicionar somente uma enão duas

Cria-se um TableColumn e adiciona ele
assim…

tabGabaritos.getColumnModel().addColumn(tblColumn);
V

Sem usar o AbstractTableModel você só estará recorrendo em xunxo atrás de xunxo. Não faça isso, aprenda a fazer direito.

L

Mas para que reescrever uma classe se basta pegar o model da coluna em vez do model da tabela… só usar um método a mais…xunxo seria reecrever uma classe somente pra fazer isso… uma carga a mais de processamento no sistema… se precisar de algo mais complexo, daí até concordo…mas pra isso… é quebrar a cabeça em vão e um pouquinho mais de peso no sistema…pois é uma classe a mais a ser carregada…

V

O DefaultTableModel é extremamente ineficiente. Colocar classes a mais no projeto não é “carga”. Ele trabalha com Vectors de Vectors, tudo isso sincronizado. Ele força você a duplicar os seus dados de modelo na view, o que exige processamento e memória. Fora que, por conta dessa duplicação, você frequentemente fere o MVC.

Torna o código confuso, embolado. Por isso é mais difícil de fazer e manter aplicações com ele.

M

Você não estará reescrevendo uma classe. Você estará escrevendo a sua classe baseada no AbstractTableModel (não é reescrever pois essa classe ainda não está escrita - DefaultTableModel é, em aplicações de verdade, furada na certa). E não haverá uma classe a mais carregada já que somente sua implementação será usada (e não sua implementação + DefaultTableModel).

L

Aproveitando o assunto de JTable… como se faz para centralizar o texto do cabeçalho e retirar a ação de ordenar dele?

Criado 9 de março de 2008
Ultima resposta 15 de jan. de 2010
Respostas 14
Participantes 6