Buenas pessoal, mais uma vez venho pedir um auxilio com JTables, comecei a fazer o model, mas verifiquei um problema que parece ser bem complicado, vamos lá.
Tenho uma classe Pessoa e duas que extendem ela (PessoaFisica, PessoaJuridica), e como na maioria dos casos de hernaça temos atributos nas classes filho que não encontramos na pai, mas ao começar o model pensei em fazer um List<Pessoa> para armazenar os dados, mas me deparei com o problema de ter que enviar informações das classes filho, alguém tem alguma sugestão de como implementar isso??
Normalmente, basta fazer com que seus TableModels também reflitam a hierarquia das suas classes.
Isso é, vc cria seu PessoaTableModel abstract e faz um filho PessoaFisicaTableModel, só complementando o que faltou.
G
guisantogui
Mas eu quero usar apenas uma uma GUI com JTable, então, neste caso eu não teria que dividir os dados em duas GUI’s, uma para Pessoa Fisica e outra para Pessoa Juridica??
V
ViniGodoy
Não entendi. Você quer ter a mesma tela para tratar dados diferentes?
Se for só para exibir, simplesmente passe o model inteiro como parâmetro para essa tela.
G
guisantogui
Eu pensei assim, uma mesma tabela com os dois tipos de pessoa e para alteração de dados e talvez uma coluna dizendo qual é o tipo de pessoa, um botão “Editar” que abriria outra GUI onde eu editaria os dados, haveria também um campo de filtro dos resultados, caso eu queira mostrar apenas um tipo ou mesmo por uma String, mas isso não vem ao caso.
V
ViniGodoy
Mas se são dados diferentes, daos diferentes, e campos diferentes, fica um pouco difícil fazer o que você quer com uma tela genérica. Exigiria você criar uma espécie de model para sua tela inteira.
G
guisantogui
Na realidade os dados são os mesmos, mas com nomes diferentes, por isso eu dividi em duas classes filho, e na GUI eu teria por exemplo para os campos datadefundação(Juridica) e datadenascimento(Fisica) seria apenas “Data” na GUI, entende.
D
drsmachado
Olha, não entendi direito o problema. Quando você tem um tipo de classe A e estende outras AB, AC, AD, todas podem ser instanciadas a partir do próprio A
A a = new AD();
Assim sendo, qual o problema em ter um ArrayList para armazenar os dados dos filhos PessoaFisica e PessoaJuridica?
Uma vez os dados dentro da ArrayList, é possível preencher a JTable.
Assim sendo, o ArrayList suporta tranquilamente os objetos das duas pessoas.
A questão é se todas as colunas terão valores compatíveis entre ambas as classes filho.
M
Marky.Vasconcelos
Deve ser um trabalho dificil pra caramba esse.
V
ViniGodoy
hahahaha, resquícios do outro tópico.
G
guisantogui
Gente remodelei o sisteminha, agora estou com o seguinte table model, mas não consigo designá-lo como TableModel da JTable, segue o código do Model:
publicclassPessoasTableModelextendsAbstractTableModel{publicstaticfinalString[]COLUNAS={"Nome","Endereço","CPF/CNPJ","Data","E-mail","Telefones"};privateList<Pessoa>pessoas;publicPessoasTableModel(List<Pessoa>pessoas,String[]COLUNAS){this.pessoas=pessoas;}publicintgetRowCount(){returnpessoas.size();}publicintgetColumnCount(){returnCOLUNAS.length;}publicObjectgetValueAt(introwIndex,intcolumnIndex){Pessoap=pessoas.get(rowIndex);switch(columnIndex){case1:returnp.getNome();case2:returnp.getEndereco();case3:returnp.getDocumento();case4:returnp.getData();case5:returnp.getEmail();case6:returnp.getTelefones();default:return"ERRO OPÇÃO NÃO ENCONTRADA";}}@OverridepublicClass<?>getColumnClass(intcolumnIndex){returnString.class;}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){returnfalse;}}
Pode estar faltando alguma parte no código, sei la, valeu pela força pessoal.
V
ViniGodoy
Tire o segundo parâmetro do construtor, ele não está servido para nada;
Pq não consegue? Dá algum erro?
G
guisantogui
Bom eu estava passando o segundo parâmetro pois ele seria o array de String que conteria as colunas, certo?
G
guisantogui
Achei o erro ele ta estourando uma NPE pq a minha lista de pessoas está vazia, como eu devo fazer para que a tabela não entenda a lista vazia como nula, ou seja como eu posso ficar sem nenhuma pessoa na minha lista sem estourar o ter que tratar a NPE.
V
ViniGodoy
Passe uma lista vazia para o JTable, não null.
Se realmente precisar passar null, mude o método getRowCount:
public int getRowCount() {
return pessoal == null ? 0 : pessoas.size();
}
G
guisantogui
Acho que não entendeu, segue o código e o stack da exceção:
TableModel:
publicclassPessoasTableModelextendsAbstractTableModel{publicstaticfinalString[]COLUNAS={"Nome","Endereço","CPF/CNPJ","Data","E-mail","Telefones"};privateList<Pessoa>pessoas;publicPessoasTableModel(List<Pessoa>pessoas){this.pessoas=pessoas;}publicintgetRowCount(){returnpessoas.size();}publicintgetColumnCount(){returnCOLUNAS.length;}publicObjectgetValueAt(introwIndex,intcolumnIndex){Pessoap=pessoas.get(rowIndex);switch(columnIndex){case1:returnp.getNome();case2:returnp.getEndereco();case3:returnp.getDocumento();case4:returnp.getData();case5:returnp.getEmail();case6:returnp.getTelefones();default:return"ERRO OPÇÃO NÃO ENCONTRADA";}}@OverridepublicClass<?>getColumnClass(intcolumnIndex){returnString.class;}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){returnfalse;}}
Não pode ser, o erro está dentro do método initComponents, não fora.
G
guisantogui
é que eu alterei o código do initComponents() :oops:
E antes que alguém diga que é impossivel mexer no intiComponents() é possivel é só ir na area de montagem da GUI e clicar na opção “personalizar código”.
V
ViniGodoy
Anexa seu o código todo dessa tela aqui, please.
Use a opção de attachments, que fica logo abaixo da caixa onde vc escreve o texto, e não a tag [code]
G
guisantogui
Segue os anexos, vlwzão pela força aí XD
V
ViniGodoy
Troque seu construtor para:
public VisualizarContatos() {
gerenciaPessoas = new GerenciaPessoas();
initComponents();
}
Você precisa do gerenciaPessoas criado antes de chamar o initComponents.
G
guisantogui
puts que coisa de noob, sério, ateh fiquei envergonhado agora com esse erro bizarramente tosco!
Isso é o que da ficar muito tempo longe dos códigos, valeu mesmo, mais uma vez, Vinny!
J
jean.zunino
guisantogui,
Faz um teste pra ver…Não tenho certeza que vai dar certo pois não testei aqui…
Você ficou muito assustado com o TableModel, sendo que o erro estava em outro lugar.
Mas é sempre bom seguir a exception. Se ela diz que ocorre na linha 57 do initializeComponents, ocorre na linha 57 do initializeComponents, e não no TableModel.
Ele nem aparecia na sua exceção.
Foi só olhar o que tinha na linha e ver onde você estava inicializando as coisas que o erro apareceu.
G
guisantogui
vlw mesmo pela força, olha só tentei resolver aqui, mas to meio perdido com esse negócio de table model, tipo onde eu seto o meu array com o nome das colunas, pq agora ta aparecendo “A B C D E F G” como colunas.
V
ViniGodoy
Faltou sobrescrever o método getColumnName. Só depois dele a JTable vai saber que o nome do seu array é o que deve ser usado na sua JTable.
G
guisantogui
Era isso ai mesmo Vinny, mais uma vez valeu pelas milhares de dicas XD e Default Table Model NUNCA MAIS
V
ViniGodoy
Sim.
Lembre-se que quando você tem um TableModel próprio, você não deve usar diretamente os métodos getValueAt e setValueAt. Deixe eles pro JTable. No seu caso, crie um método get, que já retorne um objeto de dentro do model, bonitinho.
Aí basta alterar esse objeto e chamar o método fireTableUpdated, na linha dele.
Nunca mais você fará casts.
E dê uma olhada no model do Mark. Faz montar tabelas ser parecer uma piada… e de bom gosto!
G
guisantogui
por hoje tenho uma última duvida.
Para mim implemtar um metodo de addRow no meu model eu devo chamar o fireTableRowsInserted? o mesmo para sitema para deletar e alterar? Caso sim, como eu iria chamar o metodo afinal a classe é abstrata e não posso instancia-lá.
Como eu procederia daí? :?
V
ViniGodoy
A classe é abstrata, mas os métodos fire não. É esse o serviço que o AbstractTableModel presta, e por isso é vantajoso usa-lo ao invés de implementar diretamente a interface TableModel. Eis um exemplo (esse método vai no seu model):
public void add(Pessoa p) {
pessoas.add(p);
fireTableRowsInserted(p.size()-1, p.size()-1);
}
G
guisantogui
vlw pela dica de como implementar, por hoje vou dar uma pausa ai na programação, vou ver se amanha continuo. De qual quer forma brigadão mais uma vez pela força!