Colocar criteria.list() em um AbstractTableModel

3 respostas
C

Caros, estou tentando colocar o resultado de uma consulta feita utilizando o Criteria em uma classe AbstractTableModel, conforme codigos a seguir:

Classe AbstractTableModel

package util;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class TableModel extends AbstractTableModel {
	
	private ArrayList linhas = null;
	private String[] colunas = null;
	private boolean[] colEditavel;
	
	public TableModel(ArrayList lin, String[] col, boolean[] editavel)
	{
		setLinhas(lin);
		setColunas(col);
		colEditavel = editavel;
	}
	
	public ArrayList getLinhas()
	{
		return linhas;
	}
	
	public void setLinhas(ArrayList dados)
	{
		linhas = dados;
	}
	
	public String[] getColunas()
	{
		return colunas;
	}
	
	public void setColunas(String[] nomes)
	{
		colunas = nomes;
	}
	
	public int getColumnCount()
	{
		return colunas.length;
	}
	
	public int getRowCount()
	{
		return linhas.size();
	}
	
	public String getColumnName(int numCol)
	{
		return colunas[numCol];
	}
	
	public boolean isCellEditable(int numCol)
	{
		return colEditavel[numCol];
	}
	
	public Object getValueAt(int numLin, int numCol)
	{
		Object[] linha = (Object[]) getLinhas().get(numLin);
		return linha[numCol];
	}
	
	public void setValueAt(Object dado, int numLin, int numCol)
	{
		if (isCellEditable(numCol))
		{
			Object[] linha = (Object[])getLinhas().get(numLin);
			linha[numCol] = dado;
			fireTableDataChanged();
		}
	}
	
	public void addRow(Object[] dados)
	{
		getLinhas().add(dados);
		fireTableDataChanged();
	}
	
	public void removeRow(int numLin)
	{
		getLinhas().remove(numLin);
		fireTableDataChanged();
	}
	
	public Class getColumnClass(int numCol)
	{
		Object[] linha = (Object[]) getLinhas().get(0);
		return linha[numCol].getClass();
	}
}

Metodo de pesquisa com o criteria:

public ArrayList Consulta(){
		
		Session session = HibernateFactory.AbreSession(); 
		Transaction tx = session.beginTransaction();
		try{
			Criteria criteria = session.createCriteria(Usuarios.class);
			return new ArrayList(criteria.list()); 
		} finally {
			tx.commit();
			session.close();
		}
	}

Chamada do metodo com o AbstractTableModel

UsuariosDAO usuariosdao = new UsuariosDAO();
		String[] colunas = new String[] {"Usuario I.D","Ativo","Data Cadastro","Nome","Login","Senha","Cargo"};
		int[] tamanho = new int[] {80, 60, 150, 400, 200, 200, 250};
		boolean[] edicao = {true, true, true, true, true, true};
		modelo = new TableModel(usuariosdao.Consulta(), colunas, edicao);
		tabela.setModel(modelo);
		alinhamento = new DefaultTableCellRenderer();
		for (int i = 0; i < tamanho.length; i++) {
			tabela.getColumnModel().getColumn(i).setPreferredWidth(tamanho[i]);
			tabela.getColumnModel().getColumn(i).setResizable(false);
			alinhamento.setHorizontalAlignment(JLabel.RIGHT);
			tabela.getColumnModel().getColumn(i).setCellRenderer(alinhamento);   
		}
		alinhamento = null;
		tabela.getTableHeader().setReorderingAllowed(false);
		tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

Quando tento executar, surge o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: modelo.Usuarios cannot be cast to [Ljava.lang.Object;
	at util.TableModel.getValueAt(TableModel.java:61)
	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.paint(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._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(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)

Me parece que ele não consegue pegar os valores do ArrayList retornado. Já pesquisei bastante aqui no forum e na net, mas não consegui solução.
Alguem poderia dar uma força?

3 Respostas

felipef
public Object getValueAt(int numLin, int numCol)   
    {   
        Object[] linha = (Object[]) getLinhas().get(numLin);   
        return linha[numCol];   
    }

Acredito que teu problema esta na linha

Voce deve fazer uma Cast para modelo.Usuarios e nao Object[]

C

felipef, no caso para manter o codigo do AbstractTableModel como generico, eu deveria alterar o List retornado pelo Criteria, para um ArrayList do tipo Object utilizado pelo getValueAt???
Como posso fazer isso, tentei aqui mas nao consegui.

C

Caros, o meu metodo Consulta, ficou segundo o codigo abaixo. Com isso, minha Classe TableModel, continua sendo do tipo generica, para qualquer outro tipo de classe, não apenas para a classe Usuarios.

public ArrayList Consulta(){
		
		Session session = HibernateFactory.AbreSession(); 
		Transaction tx = session.beginTransaction();
		try{
			Criteria criteria = session.createCriteria(Usuarios.class);
			ArrayList<Usuarios> lista = new ArrayList(criteria.list());
			ArrayList<Object> resultado = new ArrayList();
			for (Usuarios usuarios : lista){
				resultado.add(new Object[]{usuarios.getUsuarioId(),usuarios.getAtivo().toString(),usuarios.getDataCadastro().toString(),
						usuarios.getNome().toString(),usuarios.getLogin().toString(),usuarios.getSenha().toString(),usuarios.getCargos().toString()});
			}
			return (ArrayList) resultado;			
		} finally {
			tx.commit();
			session.close();
		}
	}
Criado 15 de outubro de 2009
Ultima resposta 15 de out. de 2009
Respostas 3
Participantes 2