Olá galera, estou com um problema que está tirando meu sono.
Eu estou criando um sisteminha desktop com swing bem simples de cadastro de Banda e CD.
Estou usando o Hibernate pra persistir os dados.
Eu obtenho um ArrayList através do método listarBandas() da minha classe bandaDAO onde consta os dados de todos as Bandas cadastras no BD, mas não consigo popular o JTable.
Um detalhe é que seguindo o artigo aqui do GUJ onde ensina a utilizar o TableModel com JDBC o código funciona, agora com o Hibernate dá o seguinte erro:
Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: modelo.Banda cannot be cast to java.util.ArrayList
at controle.TableModel.getValueAt(TableModel.java:72)
Onde a linha 72 é: String [] linha = (String [])getLinhas().get(rowIndex);
Vamos ao código:
Form que contém o JTable
package visao;
imports....
public class FormListaBanda extends JFrame {
public FormListaBanda() {
initComponents();
}
public static JScrollPane createJTable() {
BandaDAO bandaDAO = new BandaDAO();
ArrayList dados;
dados = bandaDAO.listarBandas();
String[] colunas = {"Cod", "Nome"};
TableModel modelo = new TableModel(dados, colunas);
JTable jtable = new JTable(modelo);
JScrollPane scrollPane = new JScrollPane(jtable);
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
return scrollPane;
}
private void initComponents() {
Container contentPane = getContentPane();
getContentPane().add(FormListaBanda.createJTable(), BorderLayout.CENTER);;
setSize(500, 150);
setVisible(true);
GroupLayout.......
}
}
Classe TableModel
package controle;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import modelo.Banda;
public class TableModel extends AbstractTableModel{
private ArrayList linhas = null;
private String [] colunas = null;
public String[] getColunas()
{
return colunas;
}
public ArrayList getLinhas()
{
return linhas;
}
public void setColunas(String[] strings)
{
colunas = strings;
}
public void setLinhas(ArrayList list)
{
linhas = list;
}
public TableModel(ArrayList dados, String[] colunas){
setLinhas(dados);
setColunas(colunas);
}
/**
* Retorna o numero de colunas no modelo
* @see javax.swing.table.TableModel#getColumnCount()
*/
public int getColumnCount()
{
return getColunas().length;
}
/**
* Retorna o numero de linhas existentes no modelo
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount()
{
return getLinhas().size();
}
public String getColumnName(int col) {
return colunas[col];
}
/**
* Obtem o valor na linha e coluna
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
public Object getValueAt(int rowIndex, int columnIndex)
{
// Obtem a linha, que é uma String []
String [] linha = (String [])getLinhas().get(rowIndex);
// Retorna o objeto que esta na coluna
return linha[columnIndex];
}
}
BandaDAO
package modelo;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class BandaDAO {
private Session sessao;
public BandaDAO() {
super();
try {
sessao = HibernateUtil.getSessionFactory().openSession();
} catch (HibernateException e) {
e.printStackTrace();
}
}
public void salvarBanda(Banda banda) throws HibernateException {
Transaction trans = this.sessao.beginTransaction();
try {
this.sessao.save(banda);
trans.commit();
} catch (Exception e) {
trans.rollback();
e.printStackTrace();
}
}
public Banda obterBanda(int id) {
Banda retorno = null;
try {
retorno = (Banda) this.sessao.load(Banda.class, id);
} catch (ObjectNotFoundException e) {
return null;
} catch (Exception e) {
e.printStackTrace();
}
return retorno;
}
public void alterarBanda(Banda banda) throws HibernateException {
Transaction trans = this.sessao.beginTransaction();
try {
this.sessao.update(banda);
trans.commit();
} catch (Exception e) {
trans.rollback();
e.printStackTrace();
}
}
public void removerBanda(Banda ba) throws HibernateException {
Transaction trans = this.sessao.beginTransaction();
try {
this.sessao.delete(ba);
trans.commit();
} catch (Exception e) {
trans.rollback();
e.printStackTrace();
}
}
public ArrayList<Banda> listarBandas() {
ArrayList<Banda> lista = null;
try {
Query q = this.sessao.createQuery(" from Banda ");
lista = (ArrayList<Banda>) q.list();
} catch (ObjectNotFoundException e) {
return null;
} catch (Exception e) {
e.printStackTrace();
}
return lista;
}
}
Classe Banda
package modelo;
public class Banda {
private Integer codigo;
private String nome;
public Banda(Integer codigo, String nome) {
this.codigo = codigo;
this.nome = nome;
}
public Banda() {
}
gets e sets.....
Mapeamento da classe Banda
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<class lazy="false" name="modelo.Banda" table="public.banda">
<!--
<id column="id" name="codigo" type="integer" >
<generator class="assigned"></generator>
</id>
-->
<id name="codigo" column="id" type="integer" length="4">
<generator class="increment"></generator>
</id>
<property column="nome" name="nome" type="string" />
</class>
</hibernate-mapping>
Acredito que meu problema está no método getValueAt(int rowIndex, int columnIndex) da classe TableModel.
Já tentei de tudo e não tive sucesso. Sou novo em Java, meu conhecimento é acadêmico. Espero que possam me dar uma dica.
Valeu!