Duvida JTable[Resolvido]

12 respostas
Enadrov

Bom dia galera, estava aprendendo a criar o TableModel e surgiu um problema o nome do titulo tabela nao aparece, só aparece A, B, C ...
Aqui segue o codigo:

public class ModeloTabela extends AbstractTableModel{
   private ArrayList linhas;
   private String[] colunas;
   private boolean[] edita;

   public ModeloTabela(ArrayList value, String[] coluna, boolean[] edita){
       setLinhas(linhas);
       setColunas(coluna);
       setEdita(edita);
    }
}

O metodo que cria a tabela:

public Component createTable(){
   String[] coluna={"Nome", "Sobrenome", Endereco"}; 
   ArrayList linha = new ArrayList();
   boolean[] edita = {true, true, true};
   
   linha.add(new String[]{"","",""});

   ModeloTabela modelo = new ModeloTabela(linha, coluna,);

  JTable jtable = new JTable(modelo);
  JScrollPane scroll = new JScrollPane(jtable);
  scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
  scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
  return scroll;
}
A duvida é a seguinte quando eu exibo a tabela ele não mostra os nomes da colunas que coloquei "nome","sobrenome","endereco", ele mostra A, B, C. Por que isso esta acontecendo? Desde ja agradeço.

12 Respostas

drsmachado

Provavelmente estes nomes estão sendo sobrescritos em algum lugar no meio do código.

CristianPalmaSola10

da uma olhada nisso

http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/table/TableModel.html#getColumnName(int)

voce tera que fazer um override desse metodo getColumnName que recebe um int como parametro
o int correspondo ao numero da coluna, voce pode fazer isso, naum é o mais correto e elegante mas function

@Override
public String getColumnName(int column)
{
if(column == 0)
{
return "colunaA");
}
else if(column == 1)
{
return "ColunaB";
}
}

entendeu?

Enadrov
Não Entendi

Não Entendi

CristianPalmaSola10

O que voce naum entendeu?

Leu a documentação diz sobre o metodo ?

É esse metodo que por padrao atribui A,B,C… como nomes de colunas para por um nome melhor na coluna, o que voce tem que fazer é um override neste metodo
por uma logica sua para definir o nome das colunas…

Tenta implementar se tiver dificuldades posta sua dificuldade ai

Ate mais boa sorte

Enadrov

Eu vou ter que sobreescrever um método deste para cada nome de coluna?

CristianPalmaSola10

Não voce tera que fazer algo assim como eu fiz e uma tablemodel que eu contrui em um projeto meu

@Override
    public String getColumnName(int column) {
        if(column == 0)
        {
            return "Nome Curso";
        }
        else if(column == 1)
        {
            return "Média";
        }
        else if(column == 2)
        {
            return "Duração";
        }
        else if(column == 3)
        {
            return "Nome Instituição";
        }

        return "";
    }

E ai agora o negocio ficou bem claro para voce ?

Enadrov

Cara acho que entendi, não vou poder testar agora, mas assim que testa posto aqui se funcionou ou não, ou qualquer alguma outra duvida que surja Valeu.

Se alguem tiver mais alguma dica fique avontade

Marlon_Meneses

@Override public String getColumnName(int column) { return colunas[column]; }

ViniGodoy

Seu TableModel deve ser específico para a classe de negócio que você está exibindo.

Por exemplo, se for um TableModel de produtos, ele deveria chamar ProdutoTableModel e, dentro dele, haverá um ArrayList de produtos.

Crie métodos get, add e remove que evitem que o programador da tela chame diretamente os métodos getValueAt e setValueAt. A idéia é que esses métodos sejam usados pelo JTable, mas a tela lide com métodos que trabalhem com classes de negócio.

Criar um TableModel genérico não é uma tarefa fácil. Não faça de maneira leviana, ou acabará com algo pior do que o próprio DefaultTableModel.
Se quiser usar um TableModel genérico, use o ObjectTableModel, já indicado pelo pessoal.

Enadrov

Galera eu criei o metogo

public String getColumnName(int column){ return colunas[column]; }
e funcionou. Porem não entendi, eu não utilizei este metodo em lugar nenhum eu apenas o criei.
O que fez funciona?

ViniGodoy

O TableModel é a forma de comunicar-se com o JTable.

Quando a JTable estiver se desenhando, ela vai, sozinha, chamar os métodos getColumnName, getColumnClass e getValueAt para saber o que ela deve desenhar. Quando um dado da JTable for editado, ela vai automaticamente chamar o método setValueAt, para te informar que o dado daquela linha/coluna mudou. Quando um usuário der 2 cliques numa célula, ela vai automaticamente chamar o método isCellEditable para saber se aquela célula é editável.

Por isso, o ideal é criar um TableModel onde você pode trabalhar livremente com suas classes de negócio (ProdutoTableModel), enquanto você deixa os métodos padrão, citados no parágrafo anterior, para o JTable se desenhar.

Enadrov

Entendi ViniGodoy valeu.

Criado 23 de julho de 2012
Ultima resposta 24 de jul. de 2012
Respostas 12
Participantes 5