JAVA -Popular JComboBox setSelectedeIndes -1 não encontra primeiro item da lista depois de usar o removeAllItems

Bom dia a todos

Espero que possam me ajudar tenho dois ComboBox no meu sistema de cadastro, no qual a partir da seleção no primeiro deve ser populado os items correspondentes no segundo, o primeiro combo tem duas categorias, uma id 0 e outra com id 1 consegui fazer com que filtre e popule as combobox de acordo, com a seleção, mas
Na hora de usar o removeAllItems(), para zerar o segundo comboxbox a cada seleção no primeiro, o setSelectedIndex -1, da erro e não salva caso eu selecione o primeiro item, do segundo combobox
E caso eu tire o -1 do setSelectedIndex, ele permite a seleção e permite salvar mas caso a selecione no ´primeiro combo a categoria 0 e posteriormente a 1 ele salva o os item selecionados com a chave estrangeira da categoria que primeiro foi selecionada.

variáveis criadas na view pra controlar a chave primaria das combobox

Vector<Integer> idTipo = new Vector<Integer>();
Vector<Integer> idTipoDrads = new Vector<Integer>();
Vector<Integer> idTipoDrads1 = new Vector<Integer>();
int codDrads;
int codCargo;

codgo que busca os dados no banco

// listar cargos para combobox
public ResultSet listarCargo() {
  conectar();
  String sql = "SELECT * FROM tb_cargo_funcao ORDER BY descricao_cargfun;";
  
  try {
    PreparedStatement stms = criarPreparedStatement(sql);
    return stms.executeQuery();
  } catch (SQLException e) {
    System.err.println(e.getMessage());
    return null;
  }
}

// listar drads  para a combobox 
public ResultSet listarDradsinterior(int idcargo) {
  conectar();
  String sql = "SELECT * FROM tb_drads WHERE fk_id_cargo_funcao = ? ORDER BY nome_drads;";
  
  try {
    PreparedStatement stms = criarPreparedStatement(sql);
    stms.setInt(1, idcargo);
    return stms.executeQuery();
  } catch (SQLException e) {
    System.err.println(e.getMessage());
    return null;
  }
}        

populando as tabelas

// popular combobox Cargos
public void popularComboBoxCargo() {
  try {
    DAOUsuario dAoUsu = new DAOUsuario();
    ResultSet rs = dAoUsu.listarCargo();
    
    while (rs.next()) {
      idTipo.addElement(rs.getInt(1));
      cbxUsuCargoFuncao.addItem(rs.getString(3));
    }
  } catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "Carregar cargos ");
  }
}

// popular combobos Drads - Drads interior
public void popularComboBoxDrads(int idCargo) {
  codCargo = idTipo.get(cbxUsuCargoFuncao.getSelectedIndex()-1);
  
  try {
    DAOUsuario dUsu = new DAOUsuario();
    ResultSet rs = dUsu.listarDradsinterior(idCargo);
    
    while (rs.next()) {
      idTipoDrads.addElement(rs.getInt(1));
      idTipoDrads1.addElement(rs.getInt(2));
      cbxUsuDrads.addItem(rs.getString(3));
    }
  } catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "carregar DRADS");
  }
}

metodo do botão registrar

private void btnRegistrarActionPerformed(java.awt.event.ActionEvent evt) {                                             
  // ações do botão registrar
  cbxUsuCargoFuncao.setVisible(true);
  cbxUsuDrads.setVisible(true);
  lblCargo.setVisible(true);
  lblDrads.setVisible(true);
  
  if (cadAlt.equals("cad")) {
    int codCargo;
    
    codCargo = idTipo.get(cbxUsuCargoFuncao.getSelectedIndex() - 1);
    codDrads = idTipoDrads.get(cbxUsuDrads.getSelectedIndex());
    mUsu = new ModelUsuario();
    mUsu.setUsuNome(txtUsuNome.getText());
    mUsu.setUsuEmail(txtUsuEmail.getText());
    mUsu.setUsuRg(txtUsuRg.getText());
    mUsu.setUsuCpf(txtUsuCpf.getText());
    
    try {
      mUsu.setFkIdCargoFuncao(codCargo);
      mUsu.setFkIdDrads(codDrads);
      JOptionPane.showMessageDialog(null, "id Salvo " + codCargo + "id salco drads " + codDrads);
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, "erro" + e);
    }
    
    try {
      mUsu.setUsuDataNasc(dtFormat.parse(txtDataNascimento.getText()));
    } catch (ParseException ex) {
      JOptionPane.showMessageDialog(this, "Digite uma data Valida", "Aletra", JOptionPane.ERROR_MESSAGE);
    }
    
    if (controllerUsuario.salvarUsuarioController(mUsu)) {
      // cadastrou novo usuario
      JOptionPane.showMessageDialog(this, "Usuario Cadastrado com Sucesso", "informação", JOptionPane.INFORMATION_MESSAGE);
      limpaFormulario();
      carregaListaUsuario();
    } else {
      JOptionPane.showMessageDialog(this, "Não foi Possivel efetuar o Cadastro", "Alerta de Erro", JOptionPane.ERROR_MESSAGE);
    }
  } else {
    // salvar alteração
    mUsu = new ModelUsuario();
    mUsu.setPkUsuarioId(Integer.parseInt(txtId.getText()));
    mUsu.setUsuNome(txtUsuNome.getText());
    mUsu.setUsuEmail(txtUsuEmail.getText());
    mUsu.setUsuRg(txtUsuRg.getText());
    mUsu.setUsuCpf(txtUsuCpf.getText());
    
    try {
      mUsu.setFkIdCargoFuncao((int) cbxUsuCargoFuncao.getSelectedItem());
      mUsu.setFkIdDrads((int) cbxUsuDrads.getSelectedItem());
      JOptionPane.showMessageDialog(null, "id Salvo " + cbxUsuCargoFuncao.getSelectedIndex() + "id salco drads " + cbxUsuDrads.getSelectedIndex());
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, "erro" + e);
    }
    
    try {
      mUsu.setUsuDataNasc(dtFormat.parse(txtDataNascimento.getText()));
    } catch (ParseException ex) {
      JOptionPane.showMessageDialog(this, "Digite uma data Valida", "Aletra", JOptionPane.ERROR_MESSAGE);
    }
    
    if (controllerUsuario.atualizarUsuariocontroller(mUsu)) {
      // alterou usuario
      JOptionPane.showMessageDialog(this, "Usuario Alterado com Sucesso!", "Informação", JOptionPane.INFORMATION_MESSAGE);
      limpaFormulario();
      carregaListaUsuario();
    } else {
      JOptionPane.showMessageDialog(this, "Erro ao Editar Usuario", "Alerta de ERRo!", JOptionPane.ERROR_MESSAGE);
    }
  }
}    

metodo de ação do primeito combobox

private void cbxUsuCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {                                                  
  // TODO add your handling code here:
  codCargo = idTipo.get(cbxUsuCargoFuncao.getSelectedIndex() - 1);
  cbxUsuDrads.removeAllItems();
  popularComboBoxDrads(codCargo);
  cbxUsuDrads.setEnabled(true);
}

Já deu um System.out pra ver o que tá vindo? Se vem todos os itens certinhos?

Bom dia, não, eu não dei um System.out para verificar mas ele esta buscando os dados certos nas colunas certas do banco, e populando as ComBoBox, tudo corre bem no cadastro desde que eu não tente limpar o segundo combo o cbxDrads, toda vez que for selecionada um item no primeiro combo cbxCargoFuncao. ex: Combo 1 possui dois itens SP e MG , caso selecione SP, o Combo 2 me traz os município de SP, caso eu selecione MG ele me traz os munícipios de MG.
Sem limpar o Combo 2 usando removeAllItems(), os dados ficam se repetindo e acumulando no Combo, a medida que eu for clicando no combo 1, e usando o removeAllItems(), ele da erro setSelectedIndex - 1, não permitindo que eu possa salvar o item um da lista no combo 2 .
Notei tbm que a vetor que uso para salvar o id da chave estrangeira tbm fica se repetindo e acumulando a medida que eu seleciono um item no combo 1.
um jeito que encontre de não dar mas erro foi tirar o -1 mas fazendo isso não consigo salvar com o numero da chave estrangeira correta após fazer o filtro de acordo com o que e selecionado no combo 1 ex: se os município de SP tem id com 1, 2, 3 e MG 21,22,23, o sistema esta salvando o id da primeira seleção que eu fizer Seja ela SP ou MG, caso eu selecione MG primeiro ele me salva o valor de ID de MG 21,22,23, caso eu selecione SP em seguida ele salva tbm o valor de id 21,22,23. se eu inicia o programa e a primeira seleção for SP, tanto para SP, quanto para MG ele traz 1,2,3.
Espero ter conseguido explicar o que estou tentando fazer e o que esta ocorrendo.

Obrigado Rodrigues

Ok, vamos por partes.

Entendi, quando vc usa o removeAllItems(); tem que mandar preencher novamente, está fazendo isso?

  • limpou
  • selecionou o estado Rio Grande do Sul
  • preencheu novamente com os dados desse estado

Mas pq vc tá usando um vetor pra salvar o ID? Vc pode selecionar mais de um estado? Essa parte ficou um pouco confusa.

Bom dia Rodrigues eu consegui resolver, olha como ficou o código
eu uso o vertor pra armazenar o id dos estados, para seleção vou postar como ficou o Codigo

//variaves gerais
Vector idTipo = new Vector();
Vector idTipoDrads = new Vector();

int codDrads;
int codCargo;
String cadAlt = "cad";

//popular combobox Cargos
mudei de void para DefaultComboBoxModel e usei um if para ResultSet com valor nulo, e no popular da DRADS dei u clear() no vetor

public DefaultComboBoxModel popularComboBoxCargo() {
DefaultComboBoxModel modeloCargo = new DefaultComboBoxModel();
    try {
        DAOUsuario dAoUsu = new DAOUsuario();
       
        ResultSet rs = dAoUsu.listarCargo();
        if (rs !=null) {
            modeloCargo.removeAllElements();
            while (rs.next()) {
                idTipo.addElement(rs.getInt(1));
                cbxUsuCargoFuncao.addItem(rs.getString(3));
            }
        }
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "Carregar cargos ");
        modeloCargo.removeAllElements();
    }
    return modeloCargo;
}

//popular combobos Drads - Drads interior
public DefaultComboBoxModel popularComboBoxDrads(int idCargo) {
   DefaultComboBoxModel modeloDrads =new DefaultComboBoxModel();
          
    codCargo = idTipo.get(cbxUsuCargoFuncao.getSelectedIndex()-1);
    idTipoDrads.clear(); //zerando o vetor
    
    try {
        DAOUsuario dUsu = new DAOUsuario();
        ResultSet rs = dUsu.listarDradsinterior(idCargo);
        modeloDrads.removeAllElements();
        
        if (rs != null) {
            while (rs.next()) {
                idTipoDrads.addElement(rs.getInt(1));
                cbxUsuDrads.addItem(rs.getString(3));
            }
        }
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "carregar DRADS");
        modeloDrads.removeAllElements();
    }
    return modeloDrads;
}

Ação do Botão Salvar não mudou muito mas tirei o -1 do setSelectedIndex do segundo combo
private void btnRegistrarActionPerformed(java.awt.event.ActionEvent evt) {
// ações do botão registrar
cbxUsuCargoFuncao.setVisible(true);
cbxUsuDrads.setVisible(true);
lblCargo.setVisible(true);
lblDrads.setVisible(true);

    if (cadAlt.equals("cad")) {
    int codCargo;
   
    codCargo = idTipo.get(cbxUsuCargoFuncao.getSelectedIndex() - 1);
    codDrads = idTipoDrads.get(cbxUsuDrads.getSelectedIndex());
    mUsu = new ModelUsuario();
    mUsu.setUsuNome(txtUsuNome.getText());
    mUsu.setUsuEmail(txtUsuEmail.getText());
    mUsu.setUsuRg(txtUsuRg.getText());
    mUsu.setUsuCpf(txtUsuCpf.getText());

    try {
        mUsu.setFkIdCargoFuncao(codCargo);
        mUsu.setFkIdDrads(codDrads);
        JOptionPane.showMessageDialog(null, "id Salvo " + codCargo + "id salco drads " + codDrads + "vetor " + idTipoDrads);
        
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro" + e);
    }

    try {
        mUsu.setUsuDataNasc(dtFormat.parse(txtDataNascimento.getText()));
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(this, "Digite uma data Valida", "Aletra", JOptionPane.ERROR_MESSAGE);
    }
        if (controllerUsuario.salvarUsuarioController(mUsu)) {
            //cadastrou novo usuario
            
            JOptionPane.showMessageDialog(this, "Usuario Cadastrado com Sucesso", "informação", JOptionPane.INFORMATION_MESSAGE);
            limpaFormulario();
            
            carregaListaUsuario();
        } else {
            JOptionPane.showMessageDialog(this, "Não foi Possivel efetuar o Cadastro", "Alerta de Erro", JOptionPane.ERROR_MESSAGE);
        }
    } else if (cadAlt.equals("alt"))  {
        //salvar alteração
   
        mUsu = new ModelUsuario();
        mUsu.setPkUsuarioId(Integer.parseInt(txtId.getText()));
        mUsu.setUsuNome(txtUsuNome.getText());
        mUsu.setUsuEmail(txtUsuEmail.getText());
        mUsu.setUsuRg(txtUsuRg.getText());
        mUsu.setUsuCpf(txtUsuCpf.getText());

    try {
        mUsu.setFkIdCargoFuncao((int) cbxUsuCargoFuncao.getSelectedItem());
        mUsu.setFkIdDrads((int) cbxUsuDrads.getSelectedItem());
        JOptionPane.showMessageDialog(null, "id Salvo " + cbxUsuCargoFuncao.getSelectedIndex() + "id salco drads " + cbxUsuDrads.getSelectedIndex());
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro" + e);
    }

    try {
        mUsu.setUsuDataNasc(dtFormat.parse(txtDataNascimento.getText()));
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(this, "Digite uma data Valida", "Aletra", JOptionPane.ERROR_MESSAGE);
    }
        if (controllerUsuario.atualizarUsuariocontroller(mUsu)) {
             
            //alterou usuario
            JOptionPane.showMessageDialog(this, "Usuario Alterado com Sucesso!", "Informação", JOptionPane.INFORMATION_MESSAGE);
               
            limpaFormulario();
            carregaListaUsuario();
            
        } else {
            JOptionPane.showMessageDialog(this, "Erro ao Editar Usuario", "Alerta de ERRo!", JOptionPane.ERROR_MESSAGE);
        }
        
    }

}                                            

e mantive igual a ação do primeiro combobox

private void cbxUsuCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

    codCargo = idTipo.get(cbxUsuCargoFuncao.getSelectedIndex() - 1);
        
    cbxUsuDrads.removeAllItems();
  
    popularComboBoxDrads(codCargo);
    cbxUsuDrads.setEnabled(true);
  
}                     

Com isso toda vez que seleciono um item no primeiro ComboBox ele esta zerando o segundo e me trazendo somente o que e filtrado a partir da seleção no primeiro ComboBox, e esta salvando os valores reis de ID