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:
//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?
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…
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!
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?
@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.
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.
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):
Executei e tá dando um erro de nullexception.
[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…
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à!
@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!
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?
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?
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!
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():
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!
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.
A propósito, na TableModel há muitos métodos que não são utilizados? Ou eu preciso inserir mais métodos?
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();?
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 {
Colocar o método recuperarListaDeAutores na suas classes que oferecem os serviços da persistência para a visão;
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.