Como selecionar uma dado de um combobox e inserir numa Jtable

Olá!

Estou com uma grande dificuldade para criar um collection que recebe vários autores.

Vamos ao contexto:
Estou desenvolvendo um sistema desktop. Tenho uma classe Obra e outra classe autor,
vendo o relacionamento entre elas temos que obra tem muitos autores e autor tem muitas obras, portanto, temos aí um relacionamento M:N (muitos pra muitos)

Com os annotations do Hibernate posso criar o seguinte, para relacionar/mapear esse relacionamento:
Na classe Obra:

@ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "ObraAutor", joinColumns = {@JoinColumn(name = "CodObra")}, inverseJoinColumns = {@JoinColumn(name = "CodAutor")}) private Collection<Autor> autor = new ArrayList<Autor>();

Na classe Autor:

//O FetchType.LAZY significa que o conteúdo da super classe será trazido apenas na primeira solicitação. @ManyToMany(fetch= FetchType.LAZY) @JoinTable(name="ObraAutor", joinColumns={@JoinColumn(name="CodAutor")}, inverseJoinColumns={@JoinColumn(name="CodObra")}) private Collection <Obra> obra = new ArrayList<Obra>();

Lembrando que existe no projeto classes ObraAutor e ObraAutorPK que fazem parte do relacionamento.

Na tela de cadastro de obra criei um evento do tipo gainFocus no combobox e inseri o seguinte metodo:

private void AddAutor(JTable jTable) { cmbautor.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { JComboBox comboAutor = (JComboBox) e.getSource(); String valor = (String) comboAutor.getSelectedItem(); String[] campos = new String[]{valor}; TmAutores = (DefaultTableModel) TableAutor.getModel(); TmAutores.addRow(campos); for (int i = 0; i < campos.length; i++) { Session session = HibernateUtil.getSessionFactory().openSession(); autores = session.createQuery("FROM Autor").list(); TableAutor.setValueAt(autores.get(i).getCodAutor(), i, 0); TableAutor.setValueAt(valor, i, 1); session.close(); } } }); }

Alguém sabe me dar uma ideia de como faço pra cadastrar os autores selecionados?

O anexo mostra a simples tela de cadastro.

Bom, eu prefiro trabalhar com List e ArrayList, acho mais simples.
No caso, só iria adicionar cada autor selecionado à lista e o resto o próprio hibernate se vira, quando o objeto de Obra chegar para a persistência, ele identifica, de acordo com o mapeamento, como proceder.

A tua dificuldade está em inserir os autores na collection, certo? Eu optaria por list…

Mas da forma como tô fazendo, como seria? tem alguma ideia?

Faz tempo que tô tentando mais não consegui fazer nada! :cry:

Oi, Jackye!

Seu problema consiste em recuperar os autores cadastrados.
Dica: [color=red]NÃO USE O DEFAULTTABLEMODEL[/color].

Por quê? Você tem muito trabalho ao ter que depender de Linha/Coluna para recuperar os dados, você tem cast pra cá, cast pra lá, não trabalha diretamente com os objetos do negócio além de inúmeras dificuldades de manutenção.

Aprenda a criar o seu próprio modelo para sua JTable.
Com isso, você vai conseguir recuperar uma coleção de Autores (no caso), pronta para ser adicionada no banco de dados!!

Acesse o link da minha assinatura para maiores detalhes sobre como criar um modelo próprio para sua tabela e seja feliz!

Fica com Deus! :smiley:

Então, poderia me sugestionar um código simples de como eu preencheria essa tabela [color=red]sem usar o DefaultTableModel?[/color]

Olha só, criei uma classe onde fiz minha tableModel:

[code]public class TabelaAutor extends AbstractTableModel {

    private List<Autor> autores;  
    private static final String[] col = {"CodAutor","NoAutor"};  
  
   public TabelaAutor(List<Autor> autores){  
        this.autores = autores; 

//efetua a mudança na tabela.
fireTableStructureChanged();
}

    @Override  
    public int getRowCount() {  
        return autores.size();  
    }  
  
    @Override  
    public int getColumnCount() {  
        return col.length;  
    }  
  
    @Override  
    public Object getValueAt(int rowIndex, int columnIndex) {  
        Autor autor = autores.get(rowIndex);
        Object dado = null;
        switch (columnIndex){
            case 0:
                dado = autor.getCodAutor();
            break;
            case 1:
                dado = autor.getNome();
            break; 
            case 2:
        }
        return dado;  
    }[/code]

Agora, como mudo no metodo a seguir para receber minha tablemodel?

[code]private void AddAutor() {
cmbautor.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            JComboBox comboAutor = (JComboBox) e.getSource();
            String valor = (String) comboAutor.getSelectedItem();
            String[] campos = new String[]{valor};

//Como eu modifico AQUI para que minha tablemodel receba os dados do combobox.
TmAutores = (DefaultTableModel) TableAutor.getModel();
TmAutores.addRow(campos);
for (int j = 0; j < campos.length; j++) {
Session session = HibernateUtil.getSessionFactory().openSession();
autores = session.createQuery(“FROM Autor”).list();
TableAutor.setValueAt(autores.get(j).getCodAutor(), j, 0);
TableAutor.setValueAt(valor, j, 1);
session.close();
}
}
});
}[/code]

Lembrando que é um combobox que lista todos os autores do banco de dados, quando eu clicar no autor escolhido,
a tabela seja preenchida com todos os dados do autor.

Até. :smiley:

Bom, no construtor da sua classe, você irá definir o seu modelo E associá-lo à tabela.

[code]public class FormularioDaJackye extends JFrame {

private TabelaAutor tablemodelAutor;
public FormularioDaJackye() {

    Session session = HibernateUtil.getSessionFactory().openSession();  
    autores = session.createQuery("FROM Autor").list();

    // Crio o tablemodel...
    tablemodelAutor = new TabelaAutor(autores);
    // e associo este à tabela!
    tabelaDaJackye.setModel(tablemodelAutor);
}

}[/code]

Essa é a carga inicial da sua tabela.
Agora, você faz assim: dentro do tablemodel, você cria métodos para inserir, editar, remover registros da sua tabela… Assim, você chama o inserir quando quiser adicionar algum registro nela, e assim sucessivamente.

Espero ter ajudado, abraços!

Oi! :smiley:

Realmente, usar o TableModel é bem melhor! :thumbup:

Refiz minha tableModel deixei-a assim:

import Dominio.Autor;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class TabelaAutor extends AbstractTableModel {

    private List<Autor> linhas;

    private String[] colunas = new String[]{"Código", "Nome"};

    /** Cria um uma tabela vazia. */
    public TabelaAutor() {
        linhas = new ArrayList<Autor>();
    }

    /** Cria um tabela carregada com 
     * a lista de autores especificada.
     * @param listaDeAutores 
     */
    public TabelaAutor(List<Autor> listaDeAutores) {
        linhas = new ArrayList<Autor>(listaDeAutores);
    }

    /** Retorna a quantidade de colunas. */
    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    /** Retorna a quantidade de linhas. */
    @Override
    public int getRowCount() {
        // Retorna o tamanho da lista de autores.
        return linhas.size();
    }

    /** Retorna o nome da coluna no índice especificado.
     * Este método é usado pela JTable para saber o texto do cabeçalho. */
    @Override
    public String getColumnName(int columnIndex) {
        return colunas[columnIndex];
    }

    /** Retorna a classe dos elementos da coluna especificada.
     * Este método é usado pela JTable na hora de definir o editor da célula. */
    @Override
    public Class getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return Integer.class;
            case 1:
                return String.class;
        }
        return Object.class;
    }

    /** Retorna o valor da célula especificada
     * pelos índices da linha e da coluna. */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        // Pega o autor da linha especificada.
        Autor autor = linhas.get(rowIndex);
        Object dado = null;
        switch (columnIndex) {
            case 0:
                return autor.getCodAutor();
            case 1:
                return autor.getNome();
        }
        return dado;
    }

    /** Define o valor que deve ser preenchido na tabela
     * pelos índices da linha da coluna.
     * @param value 
     */
    @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        //Define o autor especificado para ser inserido na linha.
        Autor autor = linhas.get(rowIndex);
        switch (columnIndex) {
            case 0:
                autor.setCodAutor((Integer) value);
                break;
            case 1:
                autor.setNome((String) value);
                break;
        }
        fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    /** Retorna o autor da linha especificada.
     * @param indiceLinha
     * @return  
     */
    public Autor getAutor(int indiceLinha) {
        return linhas.get(indiceLinha);
    }

    /* Adiciona um registro. */
    public void addAutor(Autor autor) {
        // Adiciona o registro.
        linhas.add(autor);
        int ultimoIndice = getRowCount() - 1;
        // Reporta a mudança. O JTable recebe a notificação
        // e se redesenha permitindo que visualizemos a atualização.
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public void addRow(Object[] row) {
        // Aqui voce acrescenta uma linha com um conjunto de registros específico  
        fireTableDataChanged();
    }

    /** Remove todos os registros. */
    public void RemoverTodos() {
        // Remove todos os elementos da lista de sócios.
        linhas.clear();
        fireTableDataChanged();
    }

    /** Remove a linha especificada.
     * @param indiceLinha 
     */
    public void removeAutor(int indiceLinha) {
        // Remove o autor da linha especificada.    	
        linhas.remove(indiceLinha);
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }

    /** Verifica se este tabela está vazia.
     * @return 
     */
    public boolean isEmpty() {
        return linhas.isEmpty();
    }
}

Conforme a dica, fiz o seguinte, coloquei o metodo no combobox com evento gainFocus (Não sei se é bom fazer assim):

[code] cmbautor.addItemListener(new ItemListener() {

        List<Autor> autores;

        @Override
        public void itemStateChanged(ItemEvent e) {
            JComboBox comboUsuario = (JComboBox) e.getSource();
            Object[] row = new String[]{};
            tabelaAutor = new TabelaAutor(autores);
            tblAutor.setModel(tabelaAutor);
            tabelaAutor.addRow(row);
            for (int j = 0; j < autores.size(); j++) {
                tabelaAutor.setValueAt(e, j, 0);
                tabelaAutor.setValueAt(e, j, 1);
            }

        }
    });[/code]

Executei e tá dando um erro de nullexception. :frowning:
[color=red]Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at java.util.ArrayList.(ArrayList.java:131)
at Visao.TabelaAutor.(TabelaAutor.java:33)
at Visao.CadastroObra2$8.itemStateChanged(CadastroObra2.java:276)
at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1205)
at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1262)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1309)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:88)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:557)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:603)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:817)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:481)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
[/color]
Por que?
Qual a maneira correta pra eu adicionar o autor do combobox para a jtable?
Ajuda, tô começando agora a programa, por isso tanta dificuldade… :cry:

at java.util.ArrayList.<init>(ArrayList.java:131) 
at Visao.TabelaAutor.<init>(TabelaAutor.java:33) 

Parece que você não instanciou a tua variável, faltou um

= new ArrayList<TipoDeClasseQueUsa>();

Jackye, o drsmachado tem razão.
Você não instanciou sua coleção; logo, dá um NullPointerException para você!

Agora, você esta QUASE certa.
Você deve carregar o seu tablemodel no construtor do seu formulário.

[code]public class FormularioDaJackye extends JFrame {

private TabelaAutor tablemodelAutores;
public FormularioDaJackye() {

    List<Autor> entidadeAutores = DAO.recuperarListaDeAutores();
    tablemodelAutores = new TabelaAutor(entidadeAutores);
}

}[/code]

Agora, no seu ItemListener, você não precisa carregar novamente o TableModel.
Você simplesmente chama o método addAutor do seu TableModel, envia como parâmetro o Autor escolhido e voilà!

[code]cmbautor.addItemListener(new ItemListener() {

@Override
public void itemStateChanged(ItemEvent e) {

    JComboBox comboboxAuxiliar = (JComboBox) e.getSource();
    // recupero qual o autor selecionado na JComboBox...
    Autor entidadeAutorSelecionado = (Autor) comboboxAuxiliar.getSelectedItem();
    //... e adiciono-o na tabela!
    tablemodelAutores.addAutor(entidadeAutorSelecionado);
}

});
[/code]
A “graça” de se usar um TableModel é não precisar de linha/coluna para definir nada, e sim objetos propriamente ditos!

Espero ter ajudado,
Fique com Deus! :smiley:

Oi! :slight_smile:

Eu fiz o que pediu, inicio o tablemodel e o recarrego no construtor do meu formulário:

[code]public class CadastroObra2 extends javax.swing.JFrame {

private TabelaAutor tabelaAutor;

/** Creates new form CadastroObra2 */
public CadastroObra2() {
    List<Autor> entidadeAutores = AutorDAO.recuperarListaDeAutores();
    tabelaAutor = new TabelaAutor(entidadeAutores);

    initComponents();

    listarAutoresCombo();
    cmbautor.setSelectedIndex(-1);
}}[/code] 

mas tá dando erro na linha:

Mostra o seguinte:
[color=blue]
cannot find symbol
symbol: method recuperarListaDeAutores()
location: class Persistencia.AutorDAO
A variável local oculta um campo[/color]

Diz que preciso criar o método recuperarListaDeAutores() na classe DAO de Autor.
Então tentei fazer assim:

/** Método que busca os campos da classe Autor. * @return */ public static List<Autor> recuperarListaDeAutores() { List<Autor> autores = new ArrayList<Autor>(); for (int i = 0; i < autores.size(); i++) { autores.get(i).getCodAutor(); autores.get(i).getNome(); } return autores; }

Só que na hora que escolhi o autor para ser add no jtable deu erro de cast:
[color=red]Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.lang.String cannot be cast to Dominio.Autor
at Visao.CadastroObra2$8.itemStateChanged(CadastroObra2.java:279)
at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1205)
at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1262)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1309)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:88)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:557)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:603)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:817)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:481)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)[/color]

Por que? :cry:

PS.: Já que [quote]A “graça” de se usar um TableModel é não precisar de linha/coluna para definir nada, e sim objetos propriamente ditos![/quote], então eu posso retirar todos aqueles métodos de adicionar linha e coluna do meu TableModel?

[quote=Jackye]Oi! :slight_smile:

Eu fiz o que pediu, inicio o tablemodel e o recarrego no construtor do meu formulário:

[code]public class CadastroObra2 extends javax.swing.JFrame {

private TabelaAutor tabelaAutor;

/** Creates new form CadastroObra2 */
public CadastroObra2() {
    List<Autor> entidadeAutores = AutorDAO.recuperarListaDeAutores();
    tabelaAutor = new TabelaAutor(entidadeAutores);

    initComponents();

    listarAutoresCombo();
    cmbautor.setSelectedIndex(-1);
}}[/code] 

[/quote]
Beleza, aqui tá certo. Você faz sua primeira carga do TableModel no seu construtor.

Sim, vai dar erro mesmo. Essa AutorDAO.recuperarListaDeAutores(); foi um exemplo. Você deve colocar ali seus próprios métodos para recuperar uma coleção de autores do banco de dados, ou recuperar uma coleção de autores do registro do livro que você estiver trabalhando no momento.

Você sabe o que representa uma classe DAO? Ela é responsável por comunicar com o banco de dados. No caso, a ideia deste método é você fazer uma consulta no banco de dados e recuperar os dados dos autores, e não do modo que você fez.
Algo parecido com isso:

[code]
public List recuperarListaDeAutores() throws SQLException {

Connection entidadeConnection = recuperarSuaConexão();
String sentenca = "SELECT * FROM AUTORES";
Statement entidadeStatement = entidadeConnection.createStatement(sentenca);
ResultSet entidadeResult = entidadeStatement.executeQuery();

List<Autor> entidadeAutores = new ArrayList<Autor>();
while (entidadeResult.next()) {
    // monta seu objeto...
    entidadeAutores.add(autor);
}
entidadeResult.close();

return entidadeAutores;

}[/code]

[quote=Jackye]
PS.: Já que [quote]A “graça” de se usar um TableModel é não precisar de linha/coluna para definir nada, e sim objetos propriamente ditos![/quote], então eu posso retirar todos aqueles métodos de adicionar linha e coluna do meu TableModel?[/quote]
Não, não remova não! Eu quis dizer que você não precisa ficar naqueles loops chatos com I e J, mas sim só passar objetos pra lá e a classe trata!

Espero ter ajudado,
Fique com Deus! :smiley:

Olá!

Um detalhe: utilizo o Hibernate. :thumbup:

Então como faço para criar o metodo no combobox que pega o nome do autor e preenche os campos de autor na Jtable?

Até.
Agradeço pela ajuda. :smiley:

É só você substituir o meu código JDBC pelo seu Hibernate e ser feliz! :thumbup:

[code]public List recuperarListaDeAutores() throws HibernateException {

Session entidadeSession = HibernateUtil.getSession();
return (List<Autor>) entidadeSession.createCriteria(Autor.class).list();

}
[/code]

Olá!

Olha como eu refiz:
TABLEMODEL:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package br.com.Visao.TableModels;

import br.com.Dominio.Autor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EventListener;
import java.util.List;
import javax.swing.event.EventListenerList;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

/**
*

  • @author Jackeline
    */
    public class TableModelAutor extends AbstractTableModel {

    private List autores;
    private static final String[] colunas = {“Código”, “Nome do Autor”};

    public TableModelAutor(List autores) {
    this.autores = autores;
    fireTableStructureChanged();
    }

    @Override
    public int getRowCount() {
    return autores.size();
    }

    @Override
    public int getColumnCount() {
    return colunas.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    Autor autor = autores.get(rowIndex);
    Object dado = null;
    switch (columnIndex) {
    case 0:
    dado = autor.getCodAutor();
    break;
    case 1:
    dado = autor.getNoAutor();
    break;
    }
    return dado;
    }

    public static String[] getColunas() {
    return colunas;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
    return super.getColumnClass(columnIndex);
    }

    @Override
    public String getColumnName(int column) {
    return super.getColumnName(column);
    }

    @Override
    public T[] getListeners(Class listenerType) {
    return super.getListeners(listenerType);
    }

    @Override
    public TableModelListener[] getTableModelListeners() {
    return super.getTableModelListeners();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    super.setValueAt(aValue, rowIndex, columnIndex);
    }

    public List getAutores() {
    return autores;
    }

    public void setAutores(List autores) {
    this.autores = autores;
    }

    public boolean containsAll(Collection<?> c) {
    return autores.containsAll©;
    }

    public boolean addAll(Collection<? extends Autor> c) {
    return autores.addAll©;
    }

    public EventListenerList getListenerList() {
    return listenerList;
    }

    public void setListenerList(EventListenerList listenerList) {
    this.listenerList = listenerList;
    }

    public Autor remove(int index) {
    return autores.remove(index);
    }

    public boolean isEmpty() {
    return autores.isEmpty();
    }

    public void clear() {
    autores.clear();
    }
    }
    [/code]

Veja no escopo do meu formulário:

[code]public class CadastrarLivro extends javax.swing.JFrame {
private TableModelAutor tabelaModelAutor;

/**
 * Creates new form CadastroLivro
 */
public CadastrarLivro() {

    List<Autor> entidadeAutores = AutorDAO.recuperarListaDeAutores();
    tabelaModelAutor = new TableModelAutor(entidadeAutores);

    initComponents();
}[/code]

Lá no AutorDAO criei o método recuperarListaDeAutores():

public static List<Autor> recuperarListaDeAutores() throws HibernateException { Session sessao = HibernateUtil.getSessionFactory().openSession(); return (List<Autor>) sessao.createCriteria(Autor.class).list(); }

No JCombobox que é populado com o nome dos autores, adicionei o evento FocusGained e inseri o método listener:

[code]private void cmdSelecionarAutorFocusGained(java.awt.event.FocusEvent evt) {
// TODO add your handling code here:
cmdSelecionarAutor.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            JComboBox comboboxAutor = (JComboBox) e.getSource();
            Autor AutorSelecionado = (Autor) comboboxAutor.getSelectedItem();
            jTbAutor.getModel().addTableModelListener(jTbAutor);
        }
    });
}[/code]

Quando executo, continua dando erro de cast! :cry:
E mostra o seguinte:
[color=red]Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.lang.String cannot be cast to br.com.Dominio.Autor
at br.com.Visao.CadastrarLivro$11.itemStateChanged(CadastrarLivro.java:775)
at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1205)
at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1262)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1309)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:88)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:557)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:603)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:817)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:481)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)[/color]

Será que tem haver com o tipo de evento? como faço para inserir o método num botão?
Preciso de ajuda. Tõ enrolada com o uso de tableModel. :frowning:
A propósito, na TableModel há muitos métodos que não são utilizados? Ou eu preciso inserir mais métodos?

Acho que o teu problema é o mesmo que eu tive há um tempo atrás (acho que é bug…).
Tenta dar um comboBox.getModel().getSelectedItem().

Como você está populando a sua JComboBox?

Olá!

Respondendo ao Nicolas Fernandes: [quote]Como você está populando a sua JComboBox?[/quote]
Eu faço o seguinte:
Criei um método a seguir:

private void popularComboboxAutor() { Session sessao = HibernateUtil.getSessionFactory().openSession(); autores = sessao.createQuery("FROM Autor").list(); if (autores.isEmpty()) { JOptionPane.showMessageDialog(null, "Nenhum registro de Autor foi encontrado."); } else { cmdSelecionarAutor.removeAllItems(); for (int i = 0; i < autores.size(); i++) { cmdSelecionarAutor.addItem(autores.get(i).getNoAutor()); } } sessao.close(); }
E chamo ele lá no InitComponents:

[code] public class CadastrarLivro extends javax.swing.JFrame {
private TableModelAutor tabelaModelAutor;

/** 
 * Creates new form CadastroLivro 
 */  
public CadastrarLivro() {  

    List<Autor> entidadeAutores = AutorDAO.recuperarListaDeAutores();  
    tabelaModelAutor = new TableModelAutor(entidadeAutores);  

    initComponents();  

//Chamo o método aqui.
popularComboboxAutor();
} [/code]
fasts, onde insiro essa linha de código?

Eu coloco essa no lugar de Autor AutorSelecionado = (Autor) comboboxAutor.getSelectedItem();?

Até.

Olá! :smiley:

Eu analisei o meu método no combobox:

[code]private void cmdSelecionarAutorFocusGained(java.awt.event.FocusEvent evt) {
cmdSelecionarAutor.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            JComboBox comboboxAutor = (JComboBox) e.getSource();
            Autor AutorSelecionado = (Autor) comboboxAutor.getSelectedItem();
            cmdSelecionarAutor.getModel().getSelectedItem();
            jTbAutor.getModel().addTableModelListener(jTbAutor);
        }
    });
} [/code]

e a linha que provoca o erro é justamente esta:

Como resolvo isso?

Até.

Suspeitei desde o princípio…

Você tá preenchendo sua JComboBox com strings, e não com objetos do tipo Autor!

Ao invés de fazer desse teu jeito, faça assim:

[code]// Coloque em um método separado. Baixo acoplamento, alta coesão, padrão de programação correto! :thumbup:
public List recuperarListaDeAutores() throws HibernateException {

Session sessao = HibernateUtil.getSessionFactory().openSession();
return sessao.createQuery("FROM Autor").list();

}[/code]

Agora, no seu método popularComboboxAutor

[code]private void popularComboboxAutor() {

try {

    cmdSelecionarAutor.removeAllItems();
    List<Autor> entidadeAutores = recuperarListaDeAutores();

    if (entidadeAutores.isEmpty()) {
        JOptionPane.showMessageDialog(null, "Nenhum autor.");
    }
    else {
    
        // ou...
        for (Autor entidadeAutor : entidadeAutores) {
            cmdSelecionarAutor.addItem(entidadeAutor);
        }

        //ou...
        cmdSelecionarAutor.setModel(new DefaultComboBoxModel(entidadeAutores.toArray()));
    }
}
catch (HibernateException hibernateException) {
    JOptionPane.showMessageDialog(String.format("%s - %s", "Erro no banco de dados!", hibernateException.getMessage()));
}
catch (Exception generalException) {
    JOptionPane.showMessageDialog(String.format("%s - %s", "Erro geral!", generalException.getMessage()));
}

}[/code]

Não se esqueça de:

  1. Colocar o método recuperarListaDeAutores na suas classes que oferecem os serviços da persistência para a visão;
  2. Adotar um padrão de desenvolvimento. Use o design pattern MVC, que é bem simples, inteligível e deixa o seu projeto bem adequado às normas de desenvolvimento.

Espero ter ajudado,
fique com Deus! :smiley: