[DUVIDA]Carregar uma combobox apartir de outra combobox

Classe comboteste: Cria a interface grafica

[code]public class ComboTeste extends JFrame{

JFrame frame;
JPanel panel;
JLabel label_estado, label_municipio;
JComboBox combo_estado, combo_municipio;
String estado;

ComboTeste(){
	
	 frame = new JFrame();
	 frame.setTitle("Carregar combo");
	 frame.setSize(300, 150);
	 frame.setLocation(300, 250);
	 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
	 
	 panel = new JPanel();
	 frame.getContentPane().add(panel);
	 panel.setLayout(null);
	 
	 label_estado = new JLabel("Estado:");
	 label_estado.setBounds(10, 10, 50, 50);
	 panel.add(label_estado);
	 
	 label_municipio = new JLabel("Municipio:");
	 label_municipio.setBounds(10, 30, 100, 100);
	 panel.add(label_municipio);
	 
	 combo_municipio = new JComboBox();
	 combo_municipio.setBounds(80, 70, 150, 20);
	 
	 combo_estado = new JComboBox();
	 combo_estado.setBounds(80, 25, 150, 20);
	 combo_estado.addItemListener(new ItemListener(){  
		 public void itemStateChanged ( ItemEvent e ) { 
			    estado = (String) combo_estado.getItemAt ( combo_estado.getSelectedIndex() );
			    System.out.println(estado);
			    TesteEntidade i = new TesteEntidade();
			    i.getUf(estado);
			    
			    System.out.println(i.getv4());
			    
			    i.comboMunicipio(combo_municipio, i.getv4(), "uf");
			    
			    combo_municipio.addItem(null);
			                 }  
		                  });  
	 carregaEstado();
	 panel.add(combo_estado);
	 
	 panel.add(combo_municipio);
	 
	 frame.setVisible(true);
	 
}

public void carregaEstado(){
	TesteEntidade m = new TesteEntidade();
 	m.comboEstado(combo_estado,"nome_estado");
}

public void carregaMunicpio(){
	TesteEntidade m = new TesteEntidade();
	m.comboteste(combo_municipio, "nome_municipio");
}


public static void main(String[] args) {
	ComboTeste x = new ComboTeste();
}

}
[/code]
Classe DML

[code]public class DML extends ConectaBD {

public String query;
public ResultSet rs;
public int x;
private String v3 = "uf", v4; 

	public String getv4(){
		return v4;
	}

         public void combo(JComboBox combo, String v1){
		try{
			String v2;
			
			rs = stm.executeQuery(query);
			while(rs.next()){
				v2 = rs.getString(1);
				combo.addItem(v2);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			System.err.println("erro");	
		}
	}
	
	public void comboteste(JComboBox combo, String v1){
		try{
			String v2;
			
			rs = stm.executeQuery(query);
			while(rs.next()){
				v2 = rs.getString(v1);
				System.out.println(v2);
				combo.addItem(v2);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			System.err.println("erro");	
		}
	}
	
	public void comboteste(String v1){
		try{
			String v2;
			
			rs = stm.executeQuery(query);
			while(rs.next()){
				v4 = rs.getString(v3);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
			System.err.println("erro");	
		}
	}

}

[/code]

[code]public class TesteEntidade extends DML{

public void comboEstado(JComboBox combo, String v1){
	query = "SELECT nome_estado, uf from estado";
	super.comboteste(combo,v1);
}

public void comboMunicipio(JComboBox combo, String v1, String v2){
	query = "SELECT nome_municipio from municipio where uf like '"+v1+"'";
	super.combo(combo, v2);
}

public void getUf(String estado){
	query = "SELECT uf from estado where nome_estado like '"+estado+"'";
	super.comboteste(estado);
}

}[/code]

Primeiro problema: Os resultados que vem do banco estão vindo duplicados

Segundo problema: Quando eu altero a combo_estado, ao inves de modificar a combo_municipio vai adicionando os municipios

alguem pode dar uma força aqui??? :wink:

alguem?

No método combo você está sempre consultando percorrendo e adicionando elementos. Se você listar municipios por UF, quando for adicionar os municipios da UF você tem que fazer

combo = new JComboBox();

Assim você limpa os municipios anteriores.

se for o caso, ainda tem o combo.removeAllItens(); ele remove os itens atuais e deixa o combo vazio para um nova insercao.

=D

entao eu tava pensando em fazer um if antes de adicionar, tipo assim, se tiver algo combo remove tudo e adiciona e se nao tiver nada apenas adiciona.

alguem tem alguma ideia de como eu faço pra verificar se a combo esta fazia?

vou postar como eu faço, ai vc vee se fica mais fácil,

Código que pega os dados do Banco:

public static List<String> getEmpresas() throws SQLException {
        
        MySQL bd = new MySQL();
        List<String> model = new ArrayList<String>();

        String sql = "SELECT e.nome FROM empresas e ORDER BY e.idEmpresa;";

        bd.conecta();

        bd.stm = bd.con.createStatement();
        bd.rs = bd.stm.executeQuery(sql);

        while (bd.rs.next()) 
            model.add(bd.rs.getString("nome"));

        bd.desconecta();

        return model;
    }

e o retorno disso eu pego aqui e jogo no combo:

private void loadCombo(){

        try{
            for (String item : ComboModel.getEmpresas())
                cbEmpresa.addItem(item);

        } catch (SQLException ex) {
            ShowMsg.errorMsg("Houve um erro ao carregar o ComboBox!"
                    + "\nDesc.: "+ex);
            return;
        }
    }

ai na tela de alteracao, onde o combo podera ser carregado mais de uma vez, eu faço como vc disse… um if pra testar se tem alguem se tiver dou um removeAllItens();

quanto aos dados estarem vindo duplicados, faz um SELECT DISTINCT que resolve.

distinct, vi isso na aula de banco de dados na facul exatamente nessa sexta feira, achei comico isso!

valeu pelo help!

mais vc sabe qual metodo q verifica se a combo esta vazia?

[quote=Renan4000]distinct, vi isso na aula de banco de dados na facul exatamente nessa sexta feira, achei comico isso!

valeu pelo help!

mais vc sabe qual metodo q verifica se a combo esta vazia?[/quote]

Porque cômico? Normalmente se uma consulta está retornando duplicatas é porque falta alguma junção na consulta ou a consulta está mal escrita.
Não lí seu código, mas você deve usar o modelo do combo e não o combo diretamente para inserir/remover elementos.

Para carregar elementos de outro combo com base na seleção de outro combo, registre um ItemListener no primeiro combo.

[]´s

dei uma olhada no seu codigo e nao achei o metodo

comico pq quando apareceu o problema no meu projeto eu tive a aula de banco de dados que falou sobre o distinct( q eu nao conhecia )…

Entao, para testar ali nao tem, esqueci de por! eaeahueahueahuuhaehue

mas usa o getItenCount();

se for = a 0 ele ta vazio.

:smiley:

gregorioarthur , era isso mesmo, valeu!