Ola a todos...sou inciante em java e estou com um problemão aqui(pelo menos para mim) heheh, eu preciso popular uma JTable com um Arraylist que retorna de uma consulta direta no banco porem ja tentei de diversas forma e sempre da erro...o codigo da jtable que estou usando é:
publicJComponenttabela(){ProgramasDaoImpldaoProg=newProgramasDaoImpl();/*O método listaTodos do DAO já me traz o resultado num ArrayList<Cliente>, então eu passo um "Collection" no construtor do novo ArrayList.*/ArrayList<Programa>listPrograma=newArrayList(daoProg.loadAllPrograma());/* Cria o model*/DefaultTableModelmodel=newDefaultTableModel(newObject[][]{},newObject[]{"CNPJ","Razão"});/* Itera a lista, criando o objeto "Cliente" apenas para pegar suas Strings.*/for(Programapro:listPrograma){model.addRow(newString[]{pro.getNomePrograma(),pro.getDescricao()});}/* Depois é só setar nosso model na tabela...*/jtable.setModel(model);JScrollPanep=newJScrollPane(jtable);returnp;}
a consulta é essa:
publicArrayListloadAllPrograma()throwsInfrastructureException{ArrayListc=null;try{em.getTransaction();Queryq=em.createQuery("SELECT progId, nomePrograma, modulo, descricao FROM Programa");c=(ArrayList)q.getResultList();System.out.println(c);returnc;}catch(Exceptione){e.printStackTrace();em.getTransaction().rollback();returnnull;}}
e o erro que ta dando é esse....
[[Ljava.lang.Object;@3afb99, [Ljava.lang.Object;@5c3987, [Ljava.lang.Object;@c4d04d, [Ljava.lang.Object;@147917a]
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to br.com.is.ishistorico.model.Programa
at br.com.is.ishistorico.gui.JPanelSEProgramas.tabela(JPanelSEProgramas.java:273)
at br.com.is.ishistorico.gui.JPanelSEProgramas.getJPanelSE(JPanelSEProgramas.java:86)
at br.com.is.ishistorico.gui.JPanelSEProgramas.initialize(JPanelSEProgramas.java:65)
at br.com.is.ishistorico.gui.JPanelSEProgramas.(JPanelSEProgramas.java:60)
at br.com.is.ishistorico.gui.JPanelSelectProgramas$5.actionPerformed(JPanelSelectProgramas.java:309)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exatamente, comece aprendendo a fazer um TableModel. Aí tarefas como essa serão triviais de se resolver.
FelipeGalli
Cara se eu entendi bem,
Esse assunto é o que mais tem no guj cara, tem que dar uma pesquisada eu mesmo que sou novo aqui acho que já respondi um parecido
de qualquer maneira da uma olhada
lá tem um tablemodel personalizado não usa Default não cara,
brs
M
marcotelles123
okssss
vlwsss vou dar uma olhada nesses exemplos pra criar um tableModel ao inves de usar o Default…flwss
M
marcotelles123
Mesmo usando o AbstractTableModel deu o mesmo erro…só que em um lugar diferente…
por algum motivo eu não estou conseguindo setar o ResultList no objeto…
Ta mas como que ta sua implementaçao no seu TableModel?
M
marcotelles123
publicclassProgramaTableModelextendsAbstractTableModel{privatestaticfinallongserialVersionUID=1L;/** * Essa lista armazenará os objetos do tipo {@link Cliente} atualmente * exibidos na tablela. */privateList<Programa>programas;// ==============================================================// Construtores.// ==============================================================/** * Constutor que simplesmente instancia o nosso {@link List} que usaremos * para guardar os valores. */publicProgramaTableModel(){// no construtor, instanciamos o Listprogramas=newArrayList<Programa>();}/** * Criamos um construtor de conveniência para já popular a lista. * * @param lista * a lista de clientes a ser adicionada. */publicProgramaTableModel(List<Programa>lista){this();programas.addAll(lista);}// ==============================================================// Métodos implementados.// ==============================================================@OverridepublicClass<?>getColumnClass(intcoluna){// todas as colunas representam uma StringreturnString.class;}publicintgetColumnCount(){// esse método deve retornar o número de colunas. No caso, 3 (uma para o// nome, uma para o sobrenome e uma para o apelido).return3;}@OverridepublicStringgetColumnName(intcoluna){// vamos retornar o nome de cada colunaswitch(coluna){case0:return"Nome";// o nome da primeira colunacase1:return"Sobrenome";// o nome da segundacase2:return"Apelido";// e o da terceiradefault:return"";// isso nunca deve ocorrer, pois temos só 3 colunas}}publicintgetRowCount(){// retorna o número de linhas, ou seja, a quantidade de entradas na// nossa lista.returnprogramas.size();}publicObjectgetValueAt(intlinha,intcoluna){// vai retornar o valor de determinada célula. A linha representa a// posição do Cliente na nossa lista e a coluna vai ser: 1 - nome, 2 -// sobrenome e 3 - apelido// primeiro vamos pegar o Cliente da linhaProgramac=(Programa)programas.get(linha);// façamos um switchswitch(coluna){case0:returnc.getNomePrograma();// retornamos o nomecase1:returnc.getDescricao();// retornamos o sobrenomecase2:returnc.getProgId();// e o apelidodefault:returnnull;// isso nunca deve ocorrer, pois temos só 3 colunas}}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){// nesse caso, todas as células são editáveisreturntrue;}@OverridepublicvoidsetValueAt(Objectvalor,intlinha,intcoluna){// aqui devemos atualizar o valor de nossos Clientes// vemos em qual linha ele estáProgramac=programas.get(linha);// e vemos o que será atualizadoswitch(coluna){case0:c.setNomePrograma(valor.toString());// mudamos o nomebreak;case1:c.setNomePrograma(valor.toString());// mudamos o sobrenomebreak;case2:c.setNomePrograma(valor.toString());// e o apelidobreak;}// é importante notificar os listeners a cada alteraçãofireTableDataChanged();}// ==============================================================// Até aqui seria o mínimo necessário para um TableModel funcional, mas// ainda não há métodos para adicionar, remover ou resgatar objetos. Vamos// criá-los.// ==============================================================/** * Adiciona um novo {@link Cliente} e notifica os listeners que um novo * registro foi adicionado. */publicvoidadiciona(Programac){programas.add(c);// informamos os listeners que a linha (size - 1) foi adicionadafireTableRowsInserted(programas.size()-1,programas.size()-1);}/** * Similar ao {@link #adiciona(Cliente)}, porém para remover. Recebe o * índice do cliente a ser removido. Se não souber o índice, use o método * {@link #getIndice(Cliente)} antes. */publicvoidremove(intindice){programas.remove(indice);fireTableRowsDeleted(indice,indice);}/** * Retorna o índice de determinado cliente. */publicintgetIndice(Programac){returnprogramas.indexOf(c);}/** * Adiciona todos os clientes na lista à este modelo. */publicvoidadicionaLista(List<Programa>lista){inti=programas.size();programas.addAll(lista);fireTableRowsInserted(i,i+lista.size());}/** * Esvazia a lista. */publicvoidlimpaLista(){inti=programas.size();programas.clear();fireTableRowsDeleted(0,i-1);}}
e outro para pegar minha lista…e quanto ao @Override…qundo tento adicion-alo no getValueAt ele da o seguinte erro…
Multiple markers at this line
- implements javax.swing.table.TableModel.getValueAt
- The method getValueAt(int, int) of type ProgramaTableModel must override a superclass
method
por isso eu tive que tirá-lo
M
marcotelles123
acho que o erro esta na hora de setar os dados do resultList no objeto
mais não sei como resolver… =/
P
Porcojava
…
lina
marcotelles123:
Mesmo usando o AbstractTableModel deu o mesmo erro…só que em um lugar diferente…
por algum motivo eu não estou conseguindo setar o ResultList no objeto…
O retorno de get(linha) do seu Array não é do tipo Programa.
Tchauzin!
M
marcotelles123
é sim pois “programas” é um ArrayList do Objeto “Programa” e esse get(linha)
Programac=(Programa)programas.get(linha);
é para pegar o Objeto no ArrayLit no índice “linha” que no caso é 0
ViniGodoy
Para que você tem esse cast? Ele não deveria ser necessário.
O seu erro também indica que de alguma forma um Object foi inserido na lista, e ele não é do tipo Programa. Como você está fazendo para carregar essa lista?
M
marcotelles123
é uma consulta direto do banco…
publicArrayListloadAllPrograma()throwsInfrastructureException{ArrayList<Programa>c=null;try{em.getTransaction();Queryq=em.createQuery("SELECT progId, nomePrograma, modulo, descricao FROM Programa");c=(ArrayList<Programa>)q.getResultList();System.out.println(c);returnc;}catch(Exceptione){e.printStackTrace();em.getTransaction().rollback();returnnull;}}
ViniGodoy
O seu método loadAllPrograma não está criando uma List<Programa>;.
Na verdade, ele está fazendo uma enorme besteira. O método getResultList() retorna uma List<Object>. Você então está tentando converter seu tipo para um List<Programa>, mas isso não converterá os tipos de objeto que estão dentro da lista. Eles continuam sendo só Objects. Na hora que você tenta fazer a leitura: ClassCastException.
Refaça o método loadAllPrograma para instanciar os programas e os adicionarem em uma List<Programa> de maneira adequada. Não será simplesmente uma questão de um cast, você provavelmente terá que instanciar os objetos na mão.