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?
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
wilnerjava
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?
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
wilnerjava
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:
packageView;importjava.util.LinkedList;importjavax.swing.table.AbstractTableModel;importjavax.swing.table.DefaultTableModel;importjavax.swing.table.TableModel;importexcecoes.CampoNaoNuloException;importexcecoes.ConflitoDePrimaryKeyException;importexcecoes.FormatoInvalidoException;importModel.Tabela;publicclassMinhaTableModelextendsAbstractTableModelimplementsTableModel{privateTabelatabelaNegocio;privateLinkedList<LinkedList<String>>dados=newLinkedList<LinkedList<String>>();publicMinhaTableModel(Tabelatabela,LinkedList<String>nomeColunas){tabelaNegocio=tabela;dados.add(nomeColunas);}publicTabelagetTabelaNegocio(){returntabelaNegocio;}publicvoidsetTabelaNegocio(TabelatabelaNegocio){this.tabelaNegocio=tabelaNegocio;}publicvoidsetValueAt(StringnovoDado,intlinha,intcoluna){// 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|CampoNaoNuloExceptione){// TODO Auto-generated catch blocke.printStackTrace();}// é importante notificar os listeners a cada alteração fireTableDataChanged();}@OverridepublicintgetColumnCount(){// TODO Auto-generated method stubreturn0;}@OverridepublicintgetRowCount(){// TODO Auto-generated method stubreturn0;}@OverridepublicObjectgetValueAt(introwIndex,intcolumnIndex){// TODO Auto-generated method stubreturnnull;}}//fim da classe
N
Nicolas_Fernandes
Opa, wilnerjava, beleza?
Algumas considerações:
Não precisa implementar a interface TableModel;
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!
W
wilnerjava
É 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
wilnerjava
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!