Problema Column da JTable

14 respostas
Robertdm

Boa tarde pessoal,

Comecei a mexer com swing(usando NetBeans) faz pouco tempo. Estou tentando obter os dados digitados em uma JTable, logo para isso eu varro todo ela pra pegar os valores e pra minha surpresa não estou conseguindo obter o valor da última coluna de nenhuma das JTables que tenho.

Por exemplo: Tenho 3 colunas chamadas Avaliacao, Descricao e Peso

Abaixo segue o código que obtem e imprime os valores da primeira linha e tb o nome das colunas

String str1 = (String)jTableAvaliacoes.getModel().getValueAt(0, 0);

String str2 = (String)jTableAvaliacoes.getModel().getValueAt(0, 1);

String str3 = (String)jTableAvaliacoes.getModel().getValueAt(0, 2);
System.err.println("Avaliacao: " + str1);

System.err.println("Descricao: " + str2);

System.err.println("Peso: " + str3);
System.err.println("Nome da Coluna: " + jTableAvaliacoes.getModel().getColumnName(0));

System.err.println("Nome da Coluna: " + jTableAvaliacoes.getModel().getColumnName(1));

System.err.println("Nome da Coluna: " + jTableAvaliacoes.getModel().getColumnName(2));

O resultado no console é:

Avaliacao: Conteúdo Avaliação
Descricao: Conteúdo Descrição
Peso: null
Nome da Coluna: Avaliação
Nome da Coluna: Descrição
Nome da Coluna: Peso

Ou seja, o valor da coluna Peso vem null e não dá nenhuma exceção.

Testei com várias JTables que tenho e com todas acontece o mesmo de não conseguir obter o valor da última coluna.

Se alguém souber o motivo e puder me ajudar agradeço.

Estou usando como model o DefaultTableModel. Sei que poderia usar outros model e tal, mas o que quero saber é qual problema está ocorrendo.

Fico no aguardo.

14 Respostas

ViniGodoy

E na tela o peso está sendo exibido?

E, pare de usar o DefaultTableModel o quanto antes. O mesmo código com um tableModel decente seria:

Avaliacao avaliacao = avaliacaoTableMode.get(0);

System.out.println("Avaliacao: " + avaliacao.getId());
System.out.println("Descricao: " + avaliacao.getDescricao());
System.out.println("Peso: " + avaliacao.getPeso());

System.out.println("Nome da Coluna: " + avaliacaoTableModel.getColumnName(0));
System.out.println("Nome da Coluna: " + avaliacaoTableModel.getColumnName(1));
System.out.println("Nome da Coluna: " + avaliacaoTableModel.getColumnName(2));
ViniGodoy

Outra coisa, ao postar códigos, siga essas dicas:
http://www.guj.com.br/posts/list/50115.java

Robertdm

Cara, desculpe minha ignorância, mas não entendi qual é o problema e como faço pra resolver. Preciso mudar e usar tableModel ao invés de DefaultTableModel?

Se pudesse me explicar um pouco mais detalhado, pois comecei a pouco com swing e não entendo bem.

Também não entendi o exemplo que me passou.

Sobre se está sendo exibido na tela, não entendi a pergunta.

Obrigado.

Grande abraço

ViniGodoy

Como vc está criando seu model?

Robertdm

Cara, o que eu fiz até agora foi o seguinte. Criei as interfaces usando o NetBeans, ou seja, inserir minhas jTables nas minhas telas e pronto. O próximo passo que estou tentando fazer é obter os dados dessas jTables pra gerar meus objetos. Então a primeira coisa que fui fazer antes de gerar os objetos e setar os atributos era ver qual o resultado de cada campo da jTable no console, pra ver se tinha feito o casting certinho e tal. E nisso encontrei esse problema ao pegar o valor da última coluna.

Sei que existe maneiras melhores de criar as jTables, porém como estou começando achei meio confuso.

Queria saber se tem como deixar assim, ou seja, continuar usando a DefaultTableModel e arrumar o problema que estou encontrando ou preciso usar outro Model?

Abraço

E

Descontando o fato que aqui há um “Movimento dos Trabalhadores Java Unidos Contra o DefaultTableModel” - MoTraJaUCoDeTaMo - de que eu também faço parte.

Se você não está conseguindo pegar o valor, provavelmente você não conseguiu setar o valor? Será que é isso? Ele aparece na tela?


Ass. Entanglement - secretário-geral do MoTraJaUCoDeTaMo, seção São Paulo

Robertdm

Quando a aplicação está rodando eu digito o valor na célula correspondente tranquilamente, não sei se era essa a pergunta?

Quando clico num botão (feito só pra testar os valores de cada ccampo da jTable) ele imprime no console então todos os valores dos campos da linha que pedi menos o valor do campo da última coluna.

Abraço

Robertdm

Só um detalhe que talvez possa auxiliar a quem for me ajudar. Se eu fizer: jTableAvaliacoes.getModel().setValueAt(“teste”, 0, 2); , ou seja, setar manualmente o valor primeiro, então eu consigo pegar o valor direitinho usando String str3 = (String)jTableAvaliacoes.getModel().getValueAt(0, 2);

Marky.Vasconcelos

entanglement:
Descontando o fato que aqui há um “Movimento dos Trabalhadores Java Unidos Contra o DefaultTableModel” - MoTraJaUCoDeTaMo - de que eu também faço parte.

Se você não está conseguindo pegar o valor, provavelmente você não conseguiu setar o valor? Será que é isso? Ele aparece na tela?


Ass. Entanglement - secretário-geral do MoTraJaUCoDeTaMo, seção São Paulo

hehe… só precisamos de um nome melhor.

MoTraJaUCoDeTaMo é dificil de decorar e falar.

Movimento dos Desenvolvedores Standard Edition Java Unidos Contra o Terrivel, Ruim e Antigo Habito do Uso do DefaultTableModel
Uma sigla seria
Mov-DeSeJa-ConTRAH-DTM
:stuck_out_tongue:

E

Entendi. O que ocorre é o seguinte: como você editou alguns valores manualmente, então esses valores não foram copiados da visualização (o que você digitou) para o modelo (ou seja, o DefaultTableModel). E é por isso que ele “não conseguiu pegar a última coluna”.
Marky, num caso desses qual “fire” que deve ser chamado para copiar a view para o model?

Marky.Vasconcelos

Nenhum, o método setValueAt da JTable apenas invoca o setValueAt do TableModel e repinta a celula.

Marky.Vasconcelos

A unica diferença é, caso o usuario arraste as colunas da tabela de lugar, o parametro col da JTable deve ser o correspondente a coluna na view, não na ordem do model.

E esse método na JTable converte esse indice pelo apropriado no model.

Robertdm

Eu apenas disse que “caso” eu faça isso (setar um valor manualmente) então eu consigo pegar o valor direitinho. Mas só fiz isso pra testar.

Eu não vou setar nenhum valor manualmente na aplicação, todos os valores serão obtidos da JTable onde o usuário digitou.

Alguma solução ou explicação do pq eu não consigo pegar o valor que foi digitado na última coluna? Como poderia resolver este problema sem precisar mudar para uma TableModel, ou seja, continuando a utilizar a DefaultTableModel.

Se consigo setar manualmente em uma célula específica, eu deveria conseguir pegar o valor que foi digitado nelça tb certo?

Obrigado pela ajuda,

Fico no aguardo.

Robertdm

Pessoal,

Realizei mais alguns testes e observei um grande detalhe que vou tentar explicar aqui:

Supomos que eu tenha uma JTable com 3 linhas e 3 colunas que vou representar aqui usando um “x” para indicar cada célula. Então a tabela ficaria assim:

x x x
x x x
x x x

Se eu preecher a tabela alguns valores (vou usar números por causa do espaço) por exemplo assim:

1 3 2
x x x
x x x

Só consigo obter o valor e imprimir os valores: “1” e “3”, pois o valor “2” não será mostrado porque após ele, não existe mais nenhum valor.

Imaginem agora que eu pego a mesma tabela e preencho assim:

1 3 2
7 4 x
x x x

Será impresso os valores: “1”, “3”, “2” e “7”, pois o valor “4” não será mostrado porque após ele, não existe mais nenhum valor.

Em resumo pessoal, só tenho acesso e consigo pegar/imprimir o valor de uma célula que não seja a última da tabela, caso contrário, se for a última preenchida não consigo obter o valor dela .

Espero que isso auxilie quem for me ajudar.

Agradeço a atenção e fico no aguardo.

Criado 20 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 14
Participantes 4