Pra que serve o GetColumnClass e como funciona?

3 respostas
Stingray

estou com problemas para entender a JtableModel, por que faço os models e so consigo erros na hora que alguma classe metodo chama este metodo do meu model…

quem chama ele ?

como eu registro uma coluna como determinada classe ?

package TableModel;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.JOptionPane;

public class CVTableModel extends AbstractTableModel
{

	private String[] colNames;
	private Object[][] data;
	
	public CVTableModel(String[] col, int linhas) 
	{
		
		// TODO Auto-generated constructor stub
		colNames = col;
		data = new Object[linhas][col.length];
		
		
	}

	public int getColumnCount() {
		// TODO Auto-generated method stub
		return colNames.length;
	}

	public int getRowCount() {
		// TODO Auto-generated method stub
		return data.length;
	}

	public Object getValueAt(int linha, int coluna) {
		// TODO Auto-generated method stub
		return data[linha][coluna];
	}
	
	public Class getColumnClass(int c) {
		
        return getValueAt(0, c).getClass();
		
    }
	
    public boolean isCellEditable(int row, int col) {

            return true;
        
    }
    
    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

}

este e meu TableModel…

e esta e minha tabela

resultadoScrollPane = new JScrollPane();
					jTabbedPane.addTab(
						"Resultados",
						null,
						resultadoScrollPane,
						null);
					resultadoScrollPane.setPreferredSize(new java.awt.Dimension(870, 706));
					resultadoScrollPane.getHorizontalScrollBar().setEnabled(true);
					resultadoScrollPane.setAutoscrolls(true);
					resultadoScrollPane.setFocusTraversalKeysEnabled(false);
					{
						TableModel resultadosTableModel = new CVTableModel(
							new String[] { "Variedade Analisada",
								"CV29","CV38","CV37","Resultado","" },96);
						resultadosTable = new JTable();
					resultadoScrollPane.setViewportView(resultadosTable);
						resultadosTable.setModel(resultadosTableModel);
					resultadosTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
resultadosTable.setCellSelectionEnabled(true);
						
						TableColumn column = null;
						// formata o tamanho da 3º coluna do header desta tabela 
						column = resultadosTable.getColumnModel().getColumn(0);
						column.setPreferredWidth(200);
						column = resultadosTable.getColumnModel().getColumn(4);// muda isto depois para o nome da coluna Resultado
						column.setPreferredWidth(200);
						for(int i =1; i < resultadosTable.getColumnCount()-1;i++)
						{
							column = resultadosTable.getColumnModel().getColumn(i);
							column.setPreferredWidth(150);
						}

por que eu não consigo fazer a tabela rodar direito com esse tablemodel e quando coloco o DefaultTableModel ela roda belezinha…

preciso adicionar um botao no final da tabela mas nao consigo nem fazer o TableModel retornar a classe das colunas… entao to longe de conseguir ainda.

3 Respostas

FredMP

Quem chama o getColumnClass pra descobrir o tipo do campo em geral é a própria tabela e não vc.

Posta os erros aí…

Stingray

e um nullPointerException que vem do deste metodo getColumnClass…

mas acho que descobri o problema, so nao sei resolver ainda.

veja se esta certo.

acho que estou pegando esse erro por que o getColumnClass entra na minha tabela e tenta pegar o primeiro valor da coluna para determinar qual e a classe, mas acontece que a tabela e toda cheia de Null, por que inicializo ela no TableModel com nada dentro e como ela e um array de Object fica toda Null por dentro.

sera que e isso ?

como e que eu posso indicar pra esse metodo que as classes dessas colunas sao, String e JButton ? tem que colocar um valor dentro ou tem um modo mais elegante ?

FredMP

Eu faço da seguinte maneira: ao invés de usar um Object[][] pra guardar as linhas eu uso um List e adapto os métodos da minha classe que estende de AbstractTableModel pra trabalhar com ele. Daí eu deixo o método getValueAt abstrato e sobrescrevo ele usando uma classe interna anônima nas classes de tela onde preciso usar alguma tabela. Esse getValueAt usa por sua vez uma classe representando a linha daquela tabela em particular que recebe em seu construtor o objeto a ser mostrado na linha e possui um método que recebe um inteiro representando o índice do campo e me retorna o valor que quero mostrar naquele campo. Parece um pouco complicado a princípio mas é tranquilo! :smiley:
No final das contas eu tenho um só modelo que é usado pra todas as tabelas de qualquer sistema e uma classe por tabela representando a linha (essa classe geralmente fica como classe interna na tela que a utiliza)

Mais ou menos isso:

class LinhaTabelaCliente { // Uma por tabela, interna na tela Cliente c; public LinhaTabelaCliente(Object c) { this.c = (Cliente) c; } public Object getColuna(int coluna) { switch(coluna) { case 0: return c.getNome(); case 1: return c.getTelefone(); } return ""; } }

Trecho criado no momento de montagem da tabela na tela:

String[] colunas = new String[] {"Nome", "Telefone"}; ModeloTabela modelo = new ModeloTabela(minhaListaDeClientes, colunas) { public Object getValueAt(int indiceLinha, int indiceColuna) { return new LinhaTabelaCliente((Object) getLinhas().get(indiceLinha)).getCampo(indiceColuna); } // Pra tornar a tabela editável e refletir isso automaticamente seria preciso // sobrescrever aqui os métodos isEditable e setValueAt por exemplo };

O ModeloTabela é parecido com o que vc já fez mudando apenas o getValueAt pra abstrato e trocando Object[][] por List e adaptando onde for necessário. Boa sorte!

Criado 8 de agosto de 2007
Ultima resposta 9 de ago. de 2007
Respostas 3
Participantes 2