[RESOLVIDO] JComboBox Dúvida

Bom dia galera do GUJ.

Andei pesquisando aqui no GUJ e no Google uma solução para preencher um JComboBox com itens do banco de dados, porém todas as soluções que eu encontrei foram programadas de forma estruturada, e eu queria focar no OOP para facilitar minha vida futuramente.
Eu tentei resolver, porém ainda não obtive êxito, abaixo estou postando meu código.

Eu já criei a classe bean dos funcionários e essa é a minha classe DAO.
Nesse método eu faço uma consulta no banco para obter os nomes dos funcionários e jogo numa lista.

[code] public List selectComboBox(){
List lista = new ArrayList();

	try {
		PreparedStatement stm = this.conn.prepareStatement("SELECT func_nome FROM tab_funcionarios ORDER BY func_nome");
		ResultSet rs = stm.executeQuery();
					
		while (rs.next()) {
			lista.add(rs.getString("FUNC_NOME"));
		}
	} catch (SQLException e){
		JOptionPane.showMessageDialog(null, e.getLocalizedMessage(), "Select Error", JOptionPane.ERROR_MESSAGE);
	}
	return lista;
}[/code]

Agora o problema está quando eu tento pegar essa lista e usa-la para adicionar os itens dentro do JComboBox que se encontra em outra classe. Eu tentei o seguinte:

JComboBox jbcAno = new JComboBox(new DefaultComboBoxModel(new FuncDAO().selectComboBox()));

Porém ele não aceita List como parâmetro, alguém poderia me ajudar com um método mais prático e sem deixar de lado a OOP?

Bom dia ricksouto! estava com o mesmo problema.

Ver se esse poste pode te ajudar:

no fim do poste, postei a solução que funcionou pro meu caso.

Att. Charles

Charles obrigado pela força, eu poderia ver o código das suas 3 classes para fazer uma comparação com as que eu estou fazendo?

[quote=ricksouto]Charles obrigado pela força, eu poderia ver o código das suas 3 classes para fazer uma comparação com as que eu estou fazendo?
[/quote]

Boa dia rick, segue os codigos:

Classe Tipo

package model.usuario;

public class Tipo {
	private String nome;

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}
	public String toString() {
		return nome;
	}

}

Classe TipoDAO:

public class TipoDAO {

	private Connection connection;
	
	public TipoDAO(){
		this.connection = new ConnectionFactory().getConnection();
		
	}
	
	
	public void carregaCombo(JComboBox jcTipo){ 
		try{ 
			PreparedStatement stmt = this.connection.prepareStatement("select * from tipouser");
			ResultSet rs = stmt.executeQuery(); 

		while(rs.next()){  
				jcTipo.addItem(rs.getString("nome"));  
		} 


		rs.close();
		stmt.close();
		
		}catch(Exception e){ 
		e.printStackTrace(); 

		} 
	} 

	

}

Classe de Implementação eu tenho isso para o JComboBox:

private JComboBox jbTipo = new JComboBox();
tipo = new TipoDAO();
tipo.carregaCombo(jbTipo);

Espero que ajude!

Att. Charles

O problema da classe do Charles é que o DAO está manipulando objetos da interface gráfica. Ou seja, uma camada de persistência manipulando objetos da camada de apresentação. Um problema decorrente deste uso, é se tu precisar reaproveitar o DAO em um projeto Web, no mínimo vai ter uma baita dor de cabeça.

Se o teu problema é simplesmente converter a lista retornada para um array, pode utilizar o método toArray:

JComboBox jbcAno = new JComboBox(new DefaultComboBoxModel(new FuncDAO().selectComboBox().toArray(new String[0])));  

Ainda, você pode criar seu próprio modelo, herdando de AbstractListModel. Este modelo poderia utilizar uma lista internamente. É uma solução ainda melhor.

[quote=wagnerfrancisco]O problema da classe do Charles é que o DAO está manipulando objetos da interface gráfica. Ou seja, uma camada de persistência manipulando objetos da camada de apresentação. Um problema decorrente deste uso, é se tu precisar reaproveitar o DAO em um projeto Web, no mínimo vai ter uma baita dor de cabeça.

Se o teu problema é simplesmente converter a lista retornada para um array, pode utilizar o método toArray:

JComboBox jbcAno = new JComboBox(new DefaultComboBoxModel(new FuncDAO().selectComboBox().toArray(new String[0])));  

Ainda, você pode criar seu próprio modelo, herdando de AbstractListModel. Este modelo poderia utilizar uma lista internamente. É uma solução ainda melhor.[/quote]

Sobre o que o amigo falou, existe esse projeto também:

Com ele, voce pode fazer assim:

//Cria o objecto que desejo receber ObjectComboBoxModel<Endereco> modeloComboBox = null;

[code]//Metodo que irá preencher minha combobox
public void carregarListaDeEnderecos(){
modeloComboBox = new ObjectComboBoxModel<>();
modeloComboBox.setFormatter(new FormatterEndereco());
List lista = dao.findByNamedQuery(Endereco.class, “Endereco.findByClienteId”, “clienteId”, Integer.parseInt(txt_Codigo.getText()));
for(int i = 0; i < lista.size(); i++){
modeloComboBox.add(lista.get(0));
}

    box_ListaDeEnderecos.setModel(modeloComboBox);
}

[/code]

E o metodo da classe DAO.

public static List findByNamedQuery(Object classe, String namedQuery, String column, Object value) { Session em = HibernateUtil.getSessionFactory().openSession(); Query query = em.getNamedQuery(namedQuery).setParameter(column, value); List<Object> lista = query.list(); em.clear(); em.close(); return lista; }

Com isso você terá uma melhor manutenção do seu código depois e sempre irá retornar o mesmo tipo que você passou.

Endereco endereco = modeloComboBox.getSelectedObject();

Abraços

[quote=wagnerfrancisco]O problema da classe do Charles é que o DAO está manipulando objetos da interface gráfica. Ou seja, uma camada de persistência manipulando objetos da camada de apresentação. Um problema decorrente deste uso, é se tu precisar reaproveitar o DAO em um projeto Web, no mínimo vai ter uma baita dor de cabeça.

Se o teu problema é simplesmente converter a lista retornada para um array, pode utilizar o método toArray:

JComboBox jbcAno = new JComboBox(new DefaultComboBoxModel(new FuncDAO().selectComboBox().toArray(new String[0])));  

Ainda, você pode criar seu próprio modelo, herdando de AbstractListModel. Este modelo poderia utilizar uma lista internamente. É uma solução ainda melhor.[/quote]

Bom dia Wagner!
Obrigado pela dica!
Ainda sou iniciante, e estou apredento muito com a gelera aqui do fórum!

Att. Charles

[quote=CharlesEduardo][quote=wagnerfrancisco]O problema da classe do Charles é que o DAO está manipulando objetos da interface gráfica. Ou seja, uma camada de persistência manipulando objetos da camada de apresentação. Um problema decorrente deste uso, é se tu precisar reaproveitar o DAO em um projeto Web, no mínimo vai ter uma baita dor de cabeça.

Se o teu problema é simplesmente converter a lista retornada para um array, pode utilizar o método toArray:

JComboBox jbcAno = new JComboBox(new DefaultComboBoxModel(new FuncDAO().selectComboBox().toArray(new String[0])));  

Ainda, você pode criar seu próprio modelo, herdando de AbstractListModel. Este modelo poderia utilizar uma lista internamente. É uma solução ainda melhor.[/quote]

Bom dia Wagner!
Obrigado pela dica!
Ainda sou iniciante, e estou apredento muito com a gelera aqui do fórum!

Att. Charles[/quote]

Legal cara, este é o objetivo do fórum, todo mundo aprende. :smiley:

Pessoal, antes de mais nada obrigado a todos que estão colaborando, realmente aqui no GUJ da para aprender muita coisa.

Hoje após a faculdade eu vou fazer os testes aqui e posto o resultado.

Obrigado a todos.

[quote=wagnerfrancisco]O problema da classe do Charles é que o DAO está manipulando objetos da interface gráfica. Ou seja, uma camada de persistência manipulando objetos da camada de apresentação. Um problema decorrente deste uso, é se tu precisar reaproveitar o DAO em um projeto Web, no mínimo vai ter uma baita dor de cabeça.

Se o teu problema é simplesmente converter a lista retornada para um array, pode utilizar o método toArray:

JComboBox jbcAno = new JComboBox(new DefaultComboBoxModel(new FuncDAO().selectComboBox().toArray(new String[0])));  

Ainda, você pode criar seu próprio modelo, herdando de AbstractListModel. Este modelo poderia utilizar uma lista internamente. É uma solução ainda melhor.[/quote]

Wagner funcionou certinho, agora só falta eu adicionar um auto completar e está beleza, futuramente eu tento criar meu próprio modelo assim como fiz com a tabela.

Obrigado pela força pessoal.