ComboBox Dinamicas

6 respostas
shenn

eae galera tudo bom?

estou com uma duvida que eu nem sei como começar…

queria fazer uma combobox dinamica apenas por motivo de aprendizado… tipo uma combobox iria ter, marcas de carros (Ford, Fiat…), e na outra iria ter os modelos dependendo da marca que o usuario escolher…

porem eu não tenho ideia de como fazer?

minhas duvidas?

vai precisar ter uma tabela no banco de dados para cada modelo de carro?
como fica as querys? tipo vão ser apenas duas? pq a primeira de modelos de carros eu sei fazer mas e a segunda como fica?

a questão do java acho que consigo resolver…

vlww galeraa

6 Respostas

silasjr

Bom dia shenn

Acredito que seja isso:

1- vc tem uma relacao um para muitos entre marca e modelo. No caso precisa de uma tabela modelo com uma chave estrangeira da tabela marca.

2- A query de modelo seria pesquisando pela chave estrangeira da tabela marca em modelo da seguinte forma: select * from modelo where modelo.id_marca = ?

Nicolas_Fernandes

Oi, sheen.

shenn:
minhas duvidas?

vai precisar ter uma tabela no banco de dados para cada modelo de carro?


Quase isso. Você precisa de uma tabela de marcas e uma tabela de modelos, onde cada modelo terá uma relação com uma marca.

shenn:
como fica as querys? tipo vão ser apenas duas? pq a primeira de modelos de carros eu sei fazer mas e a segunda como fica?

a questão do java acho que consigo resolver...

vlww galeraa

Você cria suas classes de Domínio:
public class Marca {

    private Long ID;
    private String nome;

    //getters e setters omitidos.
}

public class Modelo {

    private Long ID;
    private String nome;
    private Marca marca;
    
    //getters e setters omitidos.
}
Depois, cria suas classes DAO (acesso a dados):
public class MarcaDAO {

    public Marca recuperarPorID(Long marcaID) throws SQLException {

        Connection connection = ConnectionFactory.getConnection(); // cria sua conexão com o BD.
        PreparedStatement statement = connection.prepareStatement("SELECT * FROM MARCAS WHERE ID = ?");
        statement.setLong(1, marcaID);
        ResultSet result = statement.executeQuery();
   
        Marca marca = new Marca();
        while (result.next()) {

            marca.setID(result.getLong("ID"));
            marca.setNome(result.getString("NOME"));
        }
        result.close();
        return marca;
    }

    public List<Marca> recuperarTodas() throws SQLException {

        Connection connection = ConnectionFactory.getConnection(); // cria sua conexão com o BD.
        PreparedStatement statement = connection.prepareStatement("SELECT * FROM MARCAS");
        ResultSet result = statement.executeQuery();
   
        List<Marca> marcas = new ArrayList<Marca>();
        while (result.next()) {

            Marca marca = new Marca();
            marca.setID(result.getLong("ID"));
            marca.setNome(result.getString("NOME"));

            marcas.add(marca);
        }
        result.close();
        return marcas;
    }
}


public class ModeloDAO {

    public List<Modelo> recuperarModelosPorMarca(Long marcaID) throws SQLException {

        Connection connection = ConnectionFactory.getConnection(); // cria sua conexão com o BD.
        PreparedStatement statement = connection.prepareStatement("SELECT * FROM MODELOS WHERE MARCA = ?");
        statement.setLong(1, marcaID);
        ResultSet result = statement.executeQuery();
   
        List<Modelo> modelos = new ArrayList<Modelo>();
        MarcaDAO marcaDAO = new MarcaDAO();
        while (result.next()) {

            Modelo modelo = new Modelo();
            modelo.setID(result.getLong("ID"));
            modelo.setNome(result.getString("NOME"));
            modelo.setMarca(marcaDAO.recuperarPorID(result.getLong("MARCA"));

            modelos.add(modelo);
        }
        result.close();
        return marcas;
    }
}
Aí tá, você cria suas ComboBoxes, recuperando os dados e criando um model novo pra elas.
MarcaDAO marcaDAO = new MarcaDAO();
List<Marca> marcas = marcaDAO.recuperarTodas();
JComboBox comboboxMarca = new JComboBox(new DefaultComboBoxModel(marcas.toArray());

// aqui é vazio, só preenche na hora que mudar a marca.
JComboBox comboboxModelo = new JComboBox(); 

// adiciona um Listener para a combo de marcas, pra avisar quando mudar.
comboboxMarca.addItemListener(new ItemListener() {

    public void stateChanged(ItemEvent event) {
    
        ModeloDAO modeloDAO = new ModeloDAO();
        Marca marca = (Marca) comboboxMarcas.getSelectedItem();

        // recupero os modelos da marca selecionada.
        List<Modelo> modelos = modeloDAO.recuperarModelosPorMarca(marca.getID());
        comboboxModelos.setModel(new DefaultComboBoxModel(modelos.toArray()));
    }
});

Claro, tá tudo sem arquitetura e sem boas práticas, mas é essa a ideia.
Espero ter ajudado, abraços!

shenn

opaa vlww galera, entendi o conceito e ja deu pra dar uma boa luz no que precisa ser feitoo…

brigadão mesmo!

shenn
opa galera estou com uma duvidaa, esta quase funcionando, mas meu dao não esta comparando para exibir só os escolhidos
<html:form action="Action?method=inicio">
	Selecione uma Marca do Carro
	<html:select property="idMarca">
		<html:option value="1">
			Marca
		</html:option>
		<html:options collection="listaMarcas" name="ListasForm" property="nomeMarca" labelName="idMarca"/>
	</html:select>
	
	<br><br>
	
	Selecione o Modelo do Carro
	<html:select property="idModelo">
		<html:option value="">
			Modelo
		</html:option>
		<html:options collection="listaModelo" name="ListasForm" property="nomeModelo" labelName="idModelo"/>
	</html:select>	
</html:form>
public List<ListasForm> recuperarModelosPorMarca (ListasForm form){
		String sql = 	" select 	p1.nome_marca as Marca, " + 
						"			p2.nome_modelo as Modelo " +
						" from 	tb_marca as p1 " +
						" inner join tb_modelo as p2 on p2.id_modelo = p1.id_marca ";
		
		try {
			
			PreparedStatement ps = conexao.prepareStatement(sql);
			//ps.setString(1, form.getIdMarca());
			ResultSet rs = ps.executeQuery();
			List<ListasForm> modelos = new ArrayList<ListasForm>();
			
			while (rs.next()){
				
				ListasForm listasForm = new ListasForm();
				listasForm.setNomeMarca(rs.getString(1));
				listasForm.setNomeModelo(rs.getString(2));

				modelos.add(listasForm);
				
			}
			ps.close();
			System.out.println("Sucesso recuperarModelosPorMarca");
			return modelos;
		} catch (Exception e) {
			System.out.println("erro recuperarModelosPorMarca");
			e.printStackTrace();
		}
		return null;
	}
Nicolas_Fernandes
shenn:
public List<ListasForm> recuperarModelosPorMarca (ListasForm form){
		String sql = 	" select 	p1.nome_marca as Marca, " + 
						"			p2.nome_modelo as Modelo " +
						" from 	tb_marca as p1 " +
						" inner join tb_modelo as p2 on p2.id_modelo = p1.id_marca ";
		
		try {
			
			PreparedStatement ps = conexao.prepareStatement(sql);
			//ps.setString(1, form.getIdMarca());
			ResultSet rs = ps.executeQuery();
			List<ListasForm> modelos = new ArrayList<ListasForm>();
			
			while (rs.next()){
				
				ListasForm listasForm = new ListasForm();
				listasForm.setNomeMarca(rs.getString(1));
				listasForm.setNomeModelo(rs.getString(2));

				modelos.add(listasForm);
				
			}
			ps.close();
			System.out.println("Sucesso recuperarModelosPorMarca");
			return modelos;
		} catch (Exception e) {
			System.out.println("erro recuperarModelosPorMarca");
			e.printStackTrace();
		}
		return null;
	}
Mas claro que não vai listar. Você tirou a sua condição da sua consulta. Onde está a cláusula WHERE que verifica qual a marca? O certo é:
public List<ListasForm> recuperarModelosPorMarca (ListasForm form) throws SQLException {
    String sql = " select p1.nome_marca as Marca, " + 
                 " p2.nome_modelo as Modelo " +
		         " from  tb_marca as p1 " +
		         "        inner join tb_modelo as p2 on p2.id_modelo = p1.id_marca " +
                 " where     p2.marca = ?";

    PreparedStatement ps = conexao.prepareStatement(sql);
    ps.setString(1, form.getIdMarca()); // é aqui que você seta o parâmetro.

Simples assim, abraço!

shenn

aha entendi, porem agora eu preciso fazer um “submit” tipo agora ele esta trazendo a primeira combo, (de marcas) e a segundo combo (de modelos) vazia…

preciso de quando eu escolher uma marca, executar uma função… fiz uma porem não esta funcionando

<script type="text/javascript">

function carregar(){
	var form = document.forms[0];
	form.action = "Action.do?method=ComboBox"
	form.submit();
} 

</script>

</head>
<body>

<html:form action="Action?method=inicio">
	Selecione uma Marca do Carro
	<html:select property="idMarca" onclick="carregar();">
		<html:option value="1">
			Marca
		</html:option>
		<html:options collection="listaMarcas" name="ListasForm" property="nomeMarca" labelName="idMarca"/>
	</html:select>
	
	<br><br>
	
	Selecione o Modelo do Carro
	<html:select property="idModelo">
		<html:option value="">
			Modelo
		</html:option>
		<html:options collection="listaModelo" name="ListasForm" property="nomeModelo" labelName="idModelo"/>
	</html:select>	
</html:form>
Criado 25 de setembro de 2011
Ultima resposta 26 de set. de 2011
Respostas 6
Participantes 3