Sou novo aqui e estou começando a me aventurar no mundo Java. Várias dúvidas vem surgindo e com muita pesquisa encontra as respostas, mas neste caso não consegui achar nada.
Estou desenvolvendo uma aplicação aqui no trabalho. No meu frame principal coloquei uma tabela de 4 colunas, onde as ações tomadas pelo usuário, devem ser mostradas (uma espécie de histórico em tela). Na primeira coluna entrará um ícone mostrando se foi bem sucedida a ação ou não, no segundo o que foi feito (Programa Iniciado, alteração de alguma configuração), no terceiro o dia e a hora em que ocorreu e no quarto apenas uma mensagem falando que já foi concluído.
Acontece que eu criei um Internal Frame para as configurações e ao salvar esta alteração, não consigo mandar ele gravar a ação numa nova linha da tabela que está no meu Frame principal.
Vc deve extender AbstractTableModel
E implementar alguns de seu métodos.
No exemplo abaixo eu crio um tableModel para qualquer tipo de objeto.
A Tabela modelo descobre quantos métodos e atributos tem na classe que eu desejo trabalhar
e invoca o seus métodos get para exibir em um grid.
packagebr.caelum.argetum.util;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.List;importjavax.swing.table.AbstractTableModel;publicclassGenericTableModelextendsAbstractTableModel{privateListlista;privateField[]campos;privateList<Method>metodosGet;publicGenericTableModel(Listlista){if(lista.isEmpty()){thrownewIllegalArgumentException("Lista não pode ser vazia");}Class<?>classe=lista.get(0).getClass();campos=classe.getDeclaredFields();metodosGet=newArrayList<Method>();for(Methodmetodo:classe.getMethods()){if(metodo.getName().startsWith("get")){metodosGet.add(metodo);}}this.lista=lista;}@OverridepublicintgetRowCount(){returnlista.size();}@OverridepublicintgetColumnCount(){returncampos.length;}@OverridepublicObjectgetValueAt(intlinha,intcoluna){Objectnegocio=this.lista.get(linha);try{Objectinvoke=metodosGet.get(coluna).invoke(negocio);returninvoke;}catch(Exceptione){e.printStackTrace();}returnnull;}@OverridepublicStringgetColumnName(intcolumn){returncampos[column].getName();}}
paulork
Você poderia nos dar um exemplo pratico de uso pra essa sua classe aí acima?
agradeço…
Rocklee6544
Desculpa pela demora aqui em casa eu fiz com anotação, devo confessar que sem annotations apanhei para fazer.
No modelo de negócio que eu fiz , eu utilizei apenas métodos get, então não tive nenhum problema.
Mas ao criar um exemplo pra vc tive alguns problemas. Pois neste caso existia alguns métodos set.
packagebr.com.agenda.bean;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.List;publicclassTestaReflection<E>{privateList<E>lista;privateField[]campos;privateMethod[]metodos;//método recebe uma lista de Objetos qualquer e o tipo de ClassepublicTestaReflection(List<E>lista,Class<E>classe){//obtem o vetor(Array) de campos(atributos) da classethis.campos=classe.getDeclaredFields();//Obtem um vetor de métodos da classethis.metodos=classe.getDeclaredMethods();//inicializa a lista da classethis.lista=lista;}publicObjectgetValueAt(intlinha,intcoluna){/*pega o objeto da lista . Não se preocupe com o E, é simplesmente um coringa que diz que a sua classe trabalha com determinado tipo objeto. ex: new TestaReflection<Contato>(); diz que todo E é visto como um tipo Contato Esse tipo de classe é se chama classe parametrizada */Enegocio=this.lista.get(linha);try{//para cada metodo de metodos pega nome do metodo.for(Methodmetodo:metodos){/*se nome começar com get o metodo é invocado. O metodo invoke precisa saber de qual objeto ele invocará o método, por este motivo passamos negocio*/if(metodo.getName().startsWith("get")){Objectinvoke=metodo.invoke(negocio);System.out.println(invoke);}}}catch(Exceptione){e.printStackTrace();}returnnull;}}
[color=red]Nesse caso nem precisava passar o Class como parâmetro para o construtor , só precisava pegar o objeto e chamar seu método getClass() para obter o molde do mesmo.[/color]
R_chieck
Ola, caso não quiser ou não conseguir implementar o seu pode usar a biblioteca Towel do Mark
Pessoal, apesar de todas as dicas, ainda não consegui identificar o que está ocorrendo no meu caso. O sistema não mostra nenhum erro mas o jTable some da tela (já tentei colocar o setVisible mas não resolve).
try{while(rsLupa.next()){intcont=0;intcod=rsLupa.getInt("cod");StringrazSocial=rsLupa.getString("razSocial");Stringfantasia=rsLupa.getString("fantasia");Stringcnpj=rsLupa.getString("cnpj");Stringcpf=rsLupa.getString("cpf");if(cnpj==null){//Atribuir valor com CPFmodelo.addRow(newObject[]{cod,razSocial,fantasia,cpf});}else{//Atribuir valor com CNPJmodelo.addRow(newObject[]{cod,razSocial,fantasia,cnpj});}}System.out.println(modelo);jTable1.setModel(modelo);//adiciona o modelo a tabela criada para consulta//jTable1.setVisible(true);}catch(SQLExceptionex){Logger.getLogger(TelaLupaCliente.class.getName()).log(Level.SEVERE,null,ex);}
Outra coisa que foi percebida é que quando eu tento imprimir o modelo ele mostra somente o endereço do objeto, apesar das informações das viriáveis (razSocial, fantasia, etc) estarem gravadas corretamenta.