[quote=ViniGodoy]Só pra constar. Eu já fui clipeiro e admito que no começo dá muita dificuldade em entender os conceitos de OO e do Java. E, para ser bem sincero, o JTextField com formatação do Java não chega aos pés do existente no clipper.
O que você deve entender é que nos métodos do AbstractTableModel você estará dizendo ao JTable o que ela deve desenhar. Cada método, diz ao java uma coisa diferente.
Por exemplo. Considere que você vai escrever um TableModel para mostrar livros na tela, e quer exibir 2 colunas, uma para o autor (coluna 0) e outra para o título (coluna 1).
public class LivrosTableModel extends AbstractTableModel {
private static final int COL_AUTOR = 0;
private static final int COL_TITULO = 1;
private List<Livro> valores;
//Esse é um construtor, que recebe a nossa lista de livros
public TitulosTableModel(List<Livro> valores) {
this.valores = new ArrayList<Livro>(valores);
}
public int getRowCount() {
//Quantas linhas tem sua tabela? Uma para cada item da lista.
return valores.size();
}
public int getColumnCount() {
//Quantas colunas tem a tabela? Nesse exemplo, só 2.
return 2;
}
public String getColumnName(int column) {
//Qual é o nome das nossas colunas?
if (column == COL_AUTOR) return "Autor";
if (column == COL_TITULO) return "Título";
return ""; //Nunca deve ocorrer
}
public Object getValueAt(int row, int column) {
//Precisamos retornar o valor da coluna column e da linha row.
Livro titulo = valores.get(row);
if (column == COL_AUTOR) return titulo.getTitulo();
else if (column == COL_TITULO) return titulo.getAutor().getNome();
return ""; //Nunca deve ocorrer
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
//Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.
//Note que vc poderia alterar 2 campos ao invés de um só.
if (columnIndex== COL_TITULO) titulo.setTitulo(aValue.toString());
else if (columnIndex== COL_AUTOR) titulo.getAutor().setNome(aValue.toString());
}
public Class<?> getColumnClass(int columnIndex) {
//Qual a classe das nossas colunas? Como estamos exibindo texto, é string.
return String.class;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
//Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
return true;
}
//Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.
//Isso elimina a necessidade de chamar o getValueAt() nas telas.
public Livro get(int row) {
return valores.get(row);
}
}
Depois, para usar esse model vc só faz:
suaTable.setModel(new LivrosTableModel(listaDeLivros));
O que o Java faz na hora de desenhar a tabela? O objeto JTable:
- Chama os método getColumnsCount() e getRowsCount() para descobrir quantas linhas e colunas deve desenhar;
- Chama o método getColumnTitle() para saber que informações irá no título da tabela;
- Chama o método getValueAt para saber o que escrever dentro da célula
- Chama o método getColumnClass() para saber como desenhar a informação. Em células do tipo Boolean.class, aparecerá um checkbox, células do tipo Integer.class serão alinhadas a direita.
- E, também, chama o método isCellEditable para verificar se deve ou não habilitar o editor.
O que as vezes demora a cair a ficha é notar que seus métodos estão respondendo ao Java. Quem chamará um método como
public Object getValueAt(int row, int column) é o JTable, enquanto está se desenhando.
Ele que dirá "Ei, quero desenhar o objeto da linha 1, coluna 3, que valor você tem pra mim aí?"
Você vai notar, depois que aprender a usar o AbstractTableModel, que o trabalho que você tem hoje no Default é enorme. Parece ainda maior se você considerar a existência de modelos ainda mais automáticos, como o do Mark. O seu código atual também fica muito desorganizado. A escrita da tabela se mistura ao código da interface gráfica. Estendendo do abstract, tudo fica separadinho:
Desenho é com a JTable
Dados é com o model
Lógica da interface é na Tela.
Desculpe o tom provocativo do post anterior. A idéia era realmente te irritar. Nem que vc se motivasse novamente a aprender o model, só pra depois jogar na minha cara. :lol:
O esforço realmente vale a pena.[/quote]
Fiz esse exemplo do Vini, mas não consigo fazer mostrar o nome das Colunas quando mostra a tabela.
Alguém saberia dizer o que pode estar acontecendo, pq pelo que entendi o método getColumnName() é que adiciona o nome as colunas. E ele é chamado e os valores são retornados(vi pelo debug), mas quando aparece a tabela, aparece sem nome algum.
