Duvida com relação a JTable e TableModel

7 respostas
W

Fala pessoal;

Eu vejo todo mundo dizer que é melhor eu mesmo implementar minha TableModel ao inves de usar a DefaultTableModel.

Na aplicação que eu estou fazendo, eu tenho que mostrar uma JTable de clientes na tela, e permitir que o usuario altere as informações ( por exemplo salario,nome etc…)
Assim que ele alterar a informação ele irá apertar enter, e então eu irei checar se a alteração é valida ( é invalida se alterou uma chave primaria para outra que já existe, colocou letras no campo idade etc)

A DefaultTable não é melhor neste caso ? Ou que métodos que eu tenho que reimplementar caso eu mesmo for criar minha tabela para que o cenario que eu descrevi acima de edição funcione?

7 Respostas

V

Não, ele nunca é melhor.

O setValueAt, que irá chamar um método da sua classe de negócio. A classe de negócio fará a validação, e automaticamente impedirá a inserção de dados inválidos.
Nos links da minha assinatura, há diversos exemplos de TableModels funcionais.

W

Haha nunca é a melhor xD

Cara, eu entendi a sua lógica, na verdade eu já tenho todas as regras de validação referentes a minha classe de negocio implementadas.

O que eu eu não entendi é:

o setValueAt é o método para alterar uma célula da tabela passando por parametro sua coluna e linha, até ai beleza.
Mas o que eu to tentando fazer é pegar a alteração que o usuario fez na JTable (EM TEMPO REAL) e validar, caso não seja valida eu disparo a mensagem.
Tem algum método que pegue a alteração em tempo real?

Da uma olhada no anexo.O cara pode ir ali em qualquer célula e alterar qualquer coisa.Estaria ele dando um setValueAt implicitamente?

Um abraço


V

Quando a pessoa dá “enter” numa célula, a JTable chama o setValueAt para validar o conteúdo colocado.
Assim, o setValueAt deve atualizar o valor dentro do model, ou ignorar o valor fornecido (caso ele não passe na validação).
Após isso, o JTable atualiza a coluna com o valor daquela célula, chamando o getValueAt novamente.

Se você quiser validar enquanto o sujeito digita na célula, terá que fornecer um TableCellEditor. Você pode, por exemplo, colocar um JTextField ou um MaskedTextField. Só não aconselho pipocar janelas durante a digitação pois, além de mala, vai ser um tanto difícil de sincronizar com os eventos de edição do JTable.

W

Beleza, estou fazendo isso.

Cara para mim está dando um erro de cast nesta linha:

MinhaTableModel modelo = (MinhaTableModel)TabelaJTable.getModel(); //no caso essa TabelaJTableseria a minha JTable que estou trabalhando

Está dando o erro:
javax.swing.table.DefaultTableModel cannot be cast to View.MinhaTableModel

como que eu consigo trabalhar usando meu modelo?

Se quiser olhar ele ta ai em baxo:

package View;

import java.util.LinkedList;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import excecoes.CampoNaoNuloException;
import excecoes.ConflitoDePrimaryKeyException;
import excecoes.FormatoInvalidoException;
import Model.Tabela;

public class MinhaTableModel extends AbstractTableModel implements TableModel{

	
	private Tabela tabelaNegocio;
	private LinkedList<LinkedList<String>> dados = new LinkedList<LinkedList<String>>();
	


	public MinhaTableModel(Tabela tabela,LinkedList<String> nomeColunas) {
		tabelaNegocio =  tabela;
		dados.add(nomeColunas);
		
	}
	

	public Tabela getTabelaNegocio() {
		return tabelaNegocio;
	}

	public void setTabelaNegocio(Tabela tabelaNegocio) {
		this.tabelaNegocio = tabelaNegocio;
	}
	
	
	public void setValueAt(String novoDado, int linha, int coluna) {  
        // aqui devemos atualizar o valor de nossos Clientes  
        // vemos em qual linha ele está    
        // e vemos o que será atualizado  
        try {
			tabelaNegocio.alterar(linha, coluna, novoDado)  ;
		} catch (ConflitoDePrimaryKeyException | FormatoInvalidoException
				| CampoNaoNuloException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        // é importante notificar os listeners a cada alteração  
       fireTableDataChanged();
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		// TODO Auto-generated method stub
		return null;
	}

	

}//fim da classe
N

Opa, wilnerjava, beleza?

Algumas considerações:

  1. Não precisa implementar a interface TableModel;
  2. Se você não está setando o seu modelo da tabela assim…

SeuTableModel seuTableModel = new SeuTableModel(); JTable tabela = new JTable(seuTableModel);
… você não conseguirá recuperar o modelo correto.

Espero ter ajudado,
fique com Deus! :smiley:

W

É verdade, eu não estava usando a JTable que estava com o model certo.Obrigado!

Outra coisa, como que eu faço para habilitar a edição das celulas da JTable?

Eu usei o metodo da MinhaModelo isCellEditable (linha,coluna) todas as celular me retornaram false;

Tem como alterar isso para que eu possa alterar dinamicamente a JTable?

Abraço

W

Nossa agora eu to entendendo os conceitos de implementar a propia tableModel.Que pergunta idiota que eu fiz!

É só eu mesmo reimplementar o metodo isCellEditable(int linha,int coluna) e setar para true sempre haha!

Obrigado pela ajuda!

Criado 12 de outubro de 2012
Ultima resposta 13 de out. de 2012
Respostas 7
Participantes 3