[Resolvido]popular JTable com um ArrayList

18 respostas
M
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 é:
public JComponent tabela(){
		ProgramasDaoImpl daoProg = new ProgramasDaoImpl();
		  /*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 = new ArrayList(daoProg.loadAllPrograma());  
		           
		         /* Cria o model*/  
		         DefaultTableModel model = new DefaultTableModel(new Object[][]{}, new Object[]{"CNPJ", "Razão"});  
		           
		         /* Itera a lista, criando o objeto "Cliente" apenas para pegar suas Strings.*/  
		         for (Programa pro : listPrograma) {  
		             model.addRow(new String[]{pro.getNomePrograma(), pro.getDescricao()});  
		         }  
		           
		         /* Depois é só setar nosso model na tabela...*/  
		         jtable.setModel(model);  
		 JScrollPane p = new JScrollPane(jtable);
		 return p;
	}

a consulta é essa:

public ArrayList loadAllPrograma() throws InfrastructureException {
		ArrayList c = null;  
		try {
			em.getTransaction();
			Query q = em.createQuery("SELECT progId, nomePrograma, modulo, descricao  FROM Programa" );
			c =   (ArrayList) q.getResultList();  
			
			System.out.println(c); 

		return c; }
		catch (Exception e){
			e.printStackTrace();
			em.getTransaction().rollback();
			return null;}
	}

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)

18 Respostas

Hebertbc

Olha ninguem recomenda usar defaultTableModel.
Se num me engano tem um metodo setDataVector(Array[][] dados, Array[] colunas)

da uma olhada http://www.guj.com.br/posts/list/15/199067.java#1001295

ViniGodoy

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

http://www.guj.com.br/posts/list/198475.java

lá tem um tablemodel personalizado não usa Default não cara,

brs

M

okssss

vlwsss vou dar uma olhada nesses exemplos pra criar um tableModel ao inves de usar o Default…flwss

M

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…

erro agora esta direcionado a esta linha

Programa c = (Programa)programas.get(linha);

erro :

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.model.ProgramaTableModel.getValueAt(ProgramaTableModel.java:90)

at javax.swing.JTable.getValueAt(Unknown Source)

at javax.swing.JTable.prepareRenderer(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)

at javax.swing.plaf.ComponentUI.update(Unknown Source)

at javax.swing.JComponent.paintComponent(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JViewport.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JLayeredPane.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paintToOffscreen(Unknown Source)

at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)

at javax.swing.RepaintManager.paint(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)

at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)

at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)

at java.awt.Container.paint(Unknown Source)

at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)

at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)

at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)

at java.awt.event.InvocationEvent.dispatch(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)
evertonsilvagomesjav

Ta mas como que ta sua implementaçao no seu TableModel?

M
public class ProgramaTableModel extends AbstractTableModel {  
	private static final long serialVersionUID = 1L;

	/**
	 * Essa lista armazenará os objetos do tipo {@link Cliente} atualmente
	 * exibidos na tablela.
	 */
	private List<Programa> programas;

	// ==============================================================
	// Construtores.
	// ==============================================================

	/**
	 * Constutor que simplesmente instancia o nosso {@link List} que usaremos
	 * para guardar os valores.
	 */
	public ProgramaTableModel() {
		// no construtor, instanciamos o List
		programas  = new ArrayList<Programa>();
	}

	/**
	 * Criamos um construtor de conveniência para já popular a lista.
	 * 
	 * @param lista
	 *            a lista de clientes a ser adicionada.
	 */
	public ProgramaTableModel(List<Programa> lista) {
		this();
		programas.addAll(lista);
	}

	// ==============================================================
	// Métodos implementados.
	// ==============================================================

	@Override
	public Class<?> getColumnClass(int coluna) {
		// todas as colunas representam uma String
		return String.class;
	}

	public int getColumnCount() {
		// 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).
		return 3;
	}

	@Override
	public String getColumnName(int coluna) {
		// vamos retornar o nome de cada coluna
		switch (coluna) {
		case 0:
			return "Nome"; // o nome da primeira coluna
		case 1:
			return "Sobrenome"; // o nome da segunda
		case 2:
			return "Apelido"; // e o da terceira
		default:
			return ""; // isso nunca deve ocorrer, pois temos só 3 colunas
		}
	}

	public int getRowCount() {
		// retorna o número de linhas, ou seja, a quantidade de entradas na
		// nossa lista.
		return programas.size();
	}

	public Object getValueAt(int linha, int coluna) {
		// 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 linha
		Programa c = (Programa)programas.get(linha);
		// façamos um switch
		switch (coluna) {
		case 0:
			return c.getNomePrograma(); // retornamos o nome
		case 1:
			return c.getDescricao(); // retornamos o sobrenome
		case 2:
			return c.getProgId(); // e o apelido
		default:
			return null; // isso nunca deve ocorrer, pois temos só 3 colunas
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		// nesse caso, todas as células são editáveis
		return true;
	}

	@Override
	public void setValueAt(Object valor, int linha, int coluna) {
		// aqui devemos atualizar o valor de nossos Clientes
		// vemos em qual linha ele está
		Programa c = programas.get(linha);
		// e vemos o que será atualizado
		switch (coluna) {
		case 0:
			c.setNomePrograma(valor.toString()); // mudamos o nome
			break;
		case 1:
			c.setNomePrograma(valor.toString()); // mudamos o sobrenome
			break;
		case 2:
			c.setNomePrograma(valor.toString()); // e o apelido
			break;
		}
		// é importante notificar os listeners a cada alteração
		fireTableDataChanged();
	}

	// ==============================================================
	// 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.
	 */
	public void adiciona(Programa c) {
		programas.add(c);
		// informamos os listeners que a linha (size - 1) foi adicionada
		fireTableRowsInserted(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.
	 */
	public void remove(int indice) {
		programas.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	/**
	 * Retorna o índice de determinado cliente.
	 */
	public int getIndice(Programa c) {
		return programas.indexOf(c);
	}

	/**
	 * Adiciona todos os clientes na lista à este modelo.
	 */
	public void adicionaLista(List<Programa> lista) {
		int i = programas.size();
		programas.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	/**
	 * Esvazia a lista.
	 */
	public void limpaLista() {
		int i = programas.size();
		programas.clear();
		fireTableRowsDeleted(0, i - 1);
	}

}
evertonsilvagomesjav

bom primeiro da pra vc criar 1 construtor só:

private List<Programa> programas;

public ProgramaTableModel(List<Programa> seuList) {   
        // no construtor, instanciamos o List   
        programas  = new ArrayList<Programa>(seuList);   
    }

segundo coloca @Override em cima do seu metodo getValuAt pra garantir que esta sobreescrevendo o método de Abstract.

M

ele possui dois construtores, um para instaciá-lo e atribuir ao model

private  JScrollPane instanciaComponentes() { 
		model = new ProgramaTableModel();
		// aqui está a grande jogada!
		model.addTableModelListener(this);
		model.adicionaLista(ProgramasDaoImpl.listarProgramas());
		// mudamos o modelo de nossa tabela
		jtable = new JTable();
		jtable.setModel(model);
		scrollPane = new JScrollPane();
		scrollPane.setViewportView(jtable);
		
		jtable.setSize(new Dimension(241, 101));
		scrollPane.setBounds(4, 111, 616, 413);
		 return scrollPane;
		
	}

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

acho que o erro esta na hora de setar os dados do resultList no objeto

mais não sei como resolver… =/

P

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…

erro agora esta direcionado a esta linha

Programa c = (Programa)programas.get(linha);

erro :

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.model.ProgramaTableModel.getValueAt(ProgramaTableModel.java:90)

at javax.swing.JTable.getValueAt(Unknown Source)

at javax.swing.JTable.prepareRenderer(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)

at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)

at javax.swing.plaf.ComponentUI.update(Unknown Source)

at javax.swing.JComponent.paintComponent(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JViewport.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at javax.swing.JLayeredPane.paint(Unknown Source)

at javax.swing.JComponent.paintChildren(Unknown Source)

at javax.swing.JComponent.paintToOffscreen(Unknown Source)

at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)

at javax.swing.RepaintManager.paint(Unknown Source)

at javax.swing.JComponent.paint(Unknown Source)

at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)

at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)

at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)

at java.awt.Container.paint(Unknown Source)

at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)

at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)

at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)

at java.awt.event.InvocationEvent.dispatch(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)

</blockquote>

Oi,

O retorno de get(linha) do seu Array não é do tipo Programa.

Tchauzin!

M

é sim pois “programas” é um ArrayList do Objeto “Programa” e esse get(linha)

Programa c = (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

é uma consulta direto do banco…

public ArrayList loadAllPrograma() throws InfrastructureException {
		ArrayList<Programa> c = null;  
		try {
			em.getTransaction();
			Query q = em.createQuery("SELECT progId, nomePrograma, modulo, descricao  FROM Programa" );
			c =   (ArrayList<Programa>) q.getResultList();  
			
			System.out.println(c); 

		return c; }
		catch (Exception e){
			e.printStackTrace();
			em.getTransaction().rollback();
			return null;}
	}
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.

ViniGodoy

Dê uma lista nesse tópico: http://www.guj.com.br/posts/list/99541.java

É o mesmo problema seu.

M

deu certo

Muio Obrigadooooo

\o/

Criado 11 de março de 2010
Ultima resposta 15 de mar. de 2010
Respostas 18
Participantes 7