[RESOLVIDO] JComboBox Dúvida

9 respostas
R

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.

public List<String> selectComboBox(){
		List <String> lista = new ArrayList<String>();

		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;
	}
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?

9 Respostas

C

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

R

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?

C

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?

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

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.

Gleidson_Henrique
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.

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

http://markytechs.wordpress.com/2010/11/04/objectcomboboxmodel/

Com ele, voce pode fazer assim:

//Cria o objecto que desejo receber
ObjectComboBoxModel<Endereco> modeloComboBox = null;
//Metodo que irá preencher minha combobox
public void carregarListaDeEnderecos(){
        modeloComboBox = new ObjectComboBoxModel<>();
        modeloComboBox.setFormatter(new FormatterEndereco());
        List<Endereco> 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);
    }
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

C

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.

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

Att. Charles

wagnerfrancisco

CharlesEduardo:
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.

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

Att. Charles

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

R

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.

R

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.

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.

Criado 5 de outubro de 2012
Ultima resposta 8 de out. de 2012
Respostas 9
Participantes 4