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

5 respostas
java
R

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

5 Respostas

R

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

R

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

R

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
R

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

R

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

Criado 7 de janeiro de 2022
Ultima resposta 11 de jan. de 2022
Respostas 5
Participantes 2