Morte definitiva ao default table model

Nessa parte do TableModel, é bom que você entenda encapsulamento antes de tentar implementar, pois mais que você ja queira praticar, entender esse conceito é essencial.

Fique a vontade para perguntar :slight_smile:

Implementei meu próprio TableModel para o meu JTable e funcionou que é uma beleza, muito obrigado pelos exemplos de TableModel. :lol:
Mas, pessoal, e com relação a JComboBox, é legal usar o DefaultComboBoxModel ou tem um modo de implementar um modelo customizado? :shock:
Obrigado. :slight_smile:

[quote=Leandro Rocha]Implementei meu próprio TableModel para o meu JTable e funcionou que é uma beleza, muito obrigado pelos exemplos de TableModel. :lol:
Mas, pessoal, e com relação a JComboBox, é legal usar o DefaultComboBoxModel ou tem um modo de implementar um modelo customizado? :shock:
Obrigado. :slight_smile: [/quote]
Legal esse modelo, vou testar: http://www.guj.com.br/java/263090-resolvidojcombobox-com-implementacao-de-comboboxmodel

Alguém tem mais alguma alternativa para o ComboBoxModel?
Legal: http://www.java2s.com/Tutorial/Java/0240__Swing/JComboBoxUsingtheCustomModel.htm
Vlw :slight_smile:

olá ViniGodoy, tem com vc me da uma ajudinha com os metodos da tablemodel

[quote=ViniGodoy]Você inicializou a lista de linhas? Pq NullPointerException tem um significado bem claro: que ela não foi inicializada. Você deve carregar a lista do banco, e então repassar a lista para seu tablemodel, caso contrário, não funciona mesmo.

Desenhar a tabela é o menor dos problemas. Quando você começar a manter um DefaultTableModel editável, ou precisar personalizar sua tabela com colunas ordenáveis, totais, ícones ou cores ou mesmo ter a coluna de ID escondida, aí conversamos melhor. Todos são problemas incríveis no Default, que são naturalmente resolvidos no seu próprio TableModel.

Além disso, na minha assinatura, tem um link para diversas implementações funcionais de TableModel. Dê uma olhada nessa do Eric:
http://www.guj.com.br/java/225793-exemplo-de-tablemodel#1156821

Vencer a curva de aprendizado é parte do processo. O fato de você perder 1 ou 2 dias aprendendo a usar uma ferramenta da forma correta não é desculpa ou justificativa para permanecer por anos dando murro em ponta de faca da forma incorreta, mesmo que a forma incorreta aparente ser mais fácil. Você vai, sim, perder algumas horas aprendendo a organizar seu projeto de maneira adequada, mas vai ganhar anos de manutenção tranquila.[/quote]

Mas o mais recomendado é criar um modelo pra cada Classe mesmo? não tem uma genérica?
Agradeço desde já

[quote=JavaS]Mas o mais recomendado é criar um modelo pra cada Classe mesmo? não tem uma genérica?
Agradeço desde já[/quote]

para usar o AbstractTableModel corretamente eu vou ter que ter uma classe para cada entidade
por exemplo:

ClienteTableModel
FuncionarioTableModel
PedidoTableModel

e assim por diante

Sim.

Imagina que eu tenho um resultset e já quero inicicia-lo na tabela:

Eu tenho minha classe assim:

	import java.sql.SQLException;
import java.util.ArrayList;
	import java.util.List;
import javax.swing.table.AbstractTableModel;

	public class ModeloTabela extends AbstractTableModel {
		
		private static final long serialVersionUID = 1L;
		DAO DAO = new DAO();
		
		private String[] colunas = {"ID Componente", "Componente", "Servidor de Origem", "Servidor de Destino", "Alias do Componente", "Ordem de Origem", "Ordem de Destino"};
		

		/* Lista de Sócios que representam as resultado. */
		private List<InfraBridge> resultado;
		
		public ModeloTabela() throws SQLException {
			resultado = DAO.consulta();
		}


		/* Retorna a quantidade de colunas. */
		@Override
		public int getColumnCount() {
			// Está retornando o tamanho do array "colunas".
			// Mas como o array é fixo, vai sempre retornar 4.
			return colunas.length;
		}

		/* Retorna a quantidade de resultado. */
		@Override
		public int getRowCount() {
			// Retorna o tamanho da lista de sócios.
			return resultado.size();
		}

		/* Retorna o nome da coluna no índice especificado.
		 * Este método é usado pela JTable para saber o texto do cabeçalho. */
		@Override
		public String getColumnName(int columnIndex) {
			// Retorna o conteúdo do Array que possui o nome das colunas
			// no índice especificado.
			return colunas[columnIndex];
		};

		/* Retorna a classe dos elementos da coluna especificada.
		 * Este método é usado pela JTable na hora de definir o editor da célula. */
		@Override
		public Class<?> getColumnClass(int columnIndex) {
			// Retorna a classe referente a coluna especificada.
			// Aqui é feito um switch para verificar qual é a coluna
			// e retornar o tipo adequado. As colunas são as mesmas
			// que foram especificadas no array "colunas".
			switch (columnIndex) {
			case 0: // Primeira coluna é o nome, que é uma String.
				return int.class;
			case 1: // Segunda coluna é o telefone, que também é uma String..
				return String.class;
			case 2: // Terceira coluna é a data de cadastro,
					// apesar de ser do tipo Calendar,
					// estou retornando Date por causa da formatação.
				return String.class;
			case 3: // Quarta coluna é a mensalidade, um double.
				return String.class;
			case 4: // Quarta coluna é a mensalidade, um double.
				return String.class;
			case 5: // Quarta coluna é a mensalidade, um double.
				return int.class;
			case 6: // Quarta coluna é a mensalidade, um double.
				return int.class;
			default:
				// Se o índice da coluna não for válido, lança um
				// IndexOutOfBoundsException (Exceção de índice fora dos limites).
				// Não foi necessário verificar se o índice da linha é inválido,
				// pois o próprio ArrayList lança a exceção caso seja inválido.
				throw new IndexOutOfBoundsException("columnIndex out of bounds");
			}
		}

		/* Retorna o valor da célula especificada
		 * pelos índices da linha e da coluna. */
		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			// Pega o sócio da linha especificada.
			InfraBridge infraBridge = resultado.get(rowIndex);

			// Retorna o campo referente a coluna especificada.
			// Aqui é feito um switch para verificar qual é a coluna
			// e retornar o campo adequado. As colunas são as mesmas
			// que foram especificadas no array "colunas".
			switch (columnIndex) {
			case 0: // Primeira coluna é o nome.
				return infraBridge.getidComponente();
			case 1: // Segunda coluna é o telefone.
				return infraBridge.getComponente();
			case 2: // Terceira coluna é a data de cadastro.
				return infraBridge.getServidorOrigem();
			case 3: // Quarta coluna é a mensalidade.
				return infraBridge.getServidorDestino();
			case 4: // Quarta coluna é a mensalidade.
				return infraBridge.getAliasComponente();
			case 5: // Quarta coluna é a mensalidade.
				return infraBridge.getOrdem1();
			case 6: // Quarta coluna é a mensalidade.
				return infraBridge.getOrdem2();
			default:
				// Se o índice da coluna não for válido, lança um
				// IndexOutOfBoundsException (Exceção de índice fora dos limites).
				// Não foi necessário verificar se o índice da linha é inválido,
				// pois o próprio ArrayList lança a exceção caso seja inválido.
				throw new IndexOutOfBoundsException("columnIndex out of bounds");
			}
		}

		
	}

Está errado???

Seu TableModel não deve ser responsavel por consultar dados no banco de dados. Prefira trabalahr com listas e o resultado poderá vir de qualquer lugar.

Olá pessoal, estou tentando utilizar o AbstractTableModel, porém, estou com problemas ao inserir um dado na tabela. Ela não está atualizando.

Bom na janela onde fica a tabela eu chamo a tela de inserção:

InserirMarcaGui im = new InserirMarcaGui(); im.setVisible(true);

Na tela de inserção botão salvar:

[code] private void botaoSalvarActionPerformed(java.awt.event.ActionEvent evt) {
Marca m = new Marca();
if (txNome.getText().length() > 0) {
m.setNome(txNome.getText());
MarcaTableModel mtb = new MarcaTableModel();
mtb.addMarca(m);
MarcaController mc = new MarcaController();
mc.cadastrar(m);

        dispose();


    }
}[/code]

Não consigo encontrar o erro. Está salvando no banco de dados. Porém a tabela não atualiza. Tenho que fechar a janela para visualizar a modificação.

Pessoal, já consegui resolver.

Você está criando um model novo, atualize o já existente.

  if (txNome.getText().length() > 0) {  
        m.setNome(txNome.getText());  
        MarcaTableModel mtb = jTable.getModel();  
        mtb.addMarca(m);  
        mtb.notifyDataSetChanged();
        MarcaController mc = new MarcaController();  
        mc.cadastrar(m);  
  
        dispose();  
  
  
    }  

É Marky.Vasconcelos perdi um tempão por um erro tão besta. Mas já está tudo ok.

Obrigada pela ajuda.

Caramba já havia estudado DefaultTableModel e não consegui implementar mas agora com esse tópico consegui implementar a tabela do jeito certo. obrigado

Muito mais fácil criar o seu próprio tableModel.

Eu o tenho usado como um classe intermediária entre o a minha BO e a swing. Está certo usá-la desse jeito?
E se eu quiser que no meu JTable apareça menos campos do que tem na minha tabela? por exemplo:

Tabela: PKID_CODIGO, VALOR, DESCRICAO, FKID_ITEM, FKID_GRUPO, FKID_CONTA

e no meu JTable eu só quero que apareça: DESCRICAO, VALOR E FKID_ITEM.

como seria isso? é possível?

Como posso usar um TableModel personalizado com uma JList?

Não é tão simples, e nem envolve necessariamente o TableModel personalizado.
a) Preencher um JList com os valores possíveis da coluna;
b) Criar um TableCellEditor que trabalhe com o List;
c) Associar o TableCellEditor a coluna em questão.

Leia mais em: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender

Vou dar uma analisada na documentacao
Muito obrigado pela atencao