Duvida sobre jcombobox

4 respostas
java
williampereira21

Bom dia, Estou com uma duvida queria saber se poderiam me ajudar com um exemplo ou algo do tipo, já programo alguma coisa mas não sou Expert ainda vamos lá:
Tenho um JComboBox que ele me traz as empresas cadastradas do banco mysql e quando escolho a empresa ele carrega os funcionários dessa empresa e eu queria extrair desses funcionarios alguns dados como telefone etc… para carregar os funcionários eu uso um ArrayList quando seleciono a empresa já tentei usar o ItemStateChange mas não consegui, gostaria muito da ajuda de vocês de como posso resolver isso.

4 Respostas

Jothar_Aleksander

1 -

Então suponho que tu tem um método que pesquisa as mesmas no BD.

2 -

Suponho que por meio de uma consulta SQL

Muito suponho = pouca informação.

O que você já fez de código? De onde vem as informações? Os dados vão popular o quê? Um JTextField? Outro JComboBox? Dê-nos mais informações para que possamos ajudá-lo.

williampereira21

Bom dia Jothar, desde já agradeço pela atenção!
tenho os métodos sim amigo

1- assim eu preencho o primeiro combo de empresas.
for (Empresa e : edao.read()) {
combo_emp.addItem(e);
}

2- Quando seleciono a empresa.

private void combo_empActionPerformed(java.awt.event.ActionEvent evt) {

if (combo_emp.getSelectedItem().equals(Empresas)) {

JOptionPane.showMessageDialog(null, Selecione uma empresa);

combo_emp.setBorder(new LineBorder(Color.RED));

} else {

combo_func.removeAllItems();

combo_emp.setBorder(new LineBorder(Color.lightGray));

FuncionarioDAO fdao = new FuncionarioDAO();

ArrayList list = fdao.getData((Empresa) combo_emp.getSelectedItem());

for (int i = 0; i < list.size(); i++) {

combo_func.addItem(list.get(i).getNome());
**Obs: Quando escolho a empresa ele lista os funcionários dessa empresa no outro combobox (combo_func) , o que eu quero é quando eu escolher o funcionário ele preencha pra mim os campos telefone e conexão conforme abaixo,  que nesse caso  aparece o primeiro da lista indice 0 do array, sei que não é aqui que faz isso e sim no combo_func  não sei como fazer para quando escolher o funcionário ele buscar essas informações para mim**

            txt_telefone_chamado2.setText(list.get(i).getTelefone());
            txt_conexao.setText(list.get(i).getConexao());
        }
    }

}

Jothar_Aleksander

1 - Use a opção de pré-formatação de código (representado pelo ícone </>) que facilita a leitura de código.

2 - Eu costumo definir a responsabilidade de preenchimento de componentes a um método específico para isso. No caso de um JComboBox, seria algo do tipo:

private void popularComboEmpresas(){
	final int = NUMERO_MINIMO_REGISTROS = 3;
	final int = TAMANHO_POPUP = 5;
	try{
		empresas = dao.Empresa.pesquisar();
		cbxEmpresa.removeAllItems();
		cbxEmpresa.addItem("Selecione...");
		
		for(bean.Empresa empresa : empresas){
			if(empresas.size() < NUMERO_MINIMO_REGISTROS)
				cbxEmpresa.setMaximumRowCount(TAMANHO_POPUP);
			else
				cbxEmpresa.setMaximumRowCount(racas.size());
			cbxEmpresa.addItem(raca.getNomeRaca());
		}
	}catch(SQLException sqle){
		System.out.println("Impossível popular o combo com as empresas. ERRO: " 
				+ sqle.getMessage());
	}
}

No caso o pacote dao tem as consultas SQL. Se o número de registros é menor que três (NUMERO_MINIMO_REGISTROS) o popup do JComboBox fica muito pequeno, daí eu aumento para cinco (TAMANHO_POPUP). Além disso, sempre eu adiciono como opção inicial “Selecione…” que daí dá para verificar que uma opção válida foi escolhida ou não fazendo a seguinte comparação:

PRIVATE STATIC FINAL INT OPCAO_INVALIDA = 0;

if(cbxEmpresa.getSelectedIndex == OPCAO_INVALIDA ){
	labelStatus.setForeground(Color.red;);
	labelStatus.setText("Escolha uma empresa!");
}

Sempre que eu (portanto, é uma sugestão) posso eu uso constantes em vez de inteiros literais. Assim o código fica mais legível sem usar muitos comentários. Além disso, para operações corriqueiras eu evito usar caixas de diálogo, porque é chato para o usuário ficar fechando-as toda hora. Então eu sempre coloco no rodapé da tela uma label para informar o status das coisas. Reservo o uso de caixas de diálogo para questões de maior relevância e pouca frequência de uso. Uma exclusão por exemplo, é um caso de relevância e, que para mim, justifica solicitar uma interação com o usuário mais direta.
Quanto às suas observações, isso se chama combobox encadeado.

Usando um código que eu tenho aqui:
1 - ComboxBox Seletor/Filtrante

private void cbxCastaAnimalItemStateChanged(java.awt.event.ItemEvent evt) {                                                
	carregarComboRacas(OPCAO_CASTA, cbxCastaAnimal.getSelectedItem()
			.toString());
}

2 - Combox filtrado (depende da opção selecionada no combox seletor)

private void carregarComboRacas(int opcao, String paramentro){
	try{
		racas = dao.Raca.pesquisar(opcao, paramentro);
		cbxRacaAnimal.removeAllItems();
		cbxRacaAnimal.addItem("Selecione...");
		
		for(bean.Raca raca : racas){
			if(racas.size() < NUMERO_MINIMO_REGISTROS)
				cbxRacaAnimal.setMaximumRowCount(NUMERO_MINIMO_REGISTROS);
			else
				cbxRacaAnimal.setMaximumRowCount(racas.size());
			cbxRacaAnimal.addItem(raca.getNomeRaca());
		}
	}catch(SQLException sqle){
		System.out.println("Impossível popular o combo com as raças. ERRO: " 
				+ sqle.getMessage());
	}
}

3 - Método de pesquisa (pacote dao)

public static List<bean.Raca> pesquisar(int ordem, String parametro) 
		 throws SQLException{
	String tipoBusca;
	List<bean.Raca> racas = new ArrayList<>();

	switch(ordem){
		case 0:
			tipoBusca = "Racas.codigo_raca";
			break;
		case 1:
			tipoBusca = "Racas.casta";
			break;
		case 2:
			tipoBusca = "Racas.especie";
			break;
		case 3:
			tipoBusca = "Racas.nome_raca";
			break;
		default:
			tipoBusca = "Racas.codigo_raca";
	}
	
	try(Connection conectaBancoDeDados = ConectaBancoDeDados.getConexao()){
		String stringSQLPesquisa = "SELECT * FROM Racas "
				+ "WHERE " + tipoBusca + " LIKE '" + parametro + "%' "
				+ "ORDER BY Racas.codigo_raca";
		
		try(PreparedStatement pstmt = conectaBancoDeDados
				.prepareStatement(stringSQLPesquisa)){
			try(ResultSet rstSet = pstmt.executeQuery()){
				while(rstSet.next()){
					bean.Raca raca = new bean.Raca();
					raca.setCodigoRaca(rstSet.getInt("codigo_raca"));
					raca.setCasta(rstSet.getString("casta"));
					raca.setEspecie(rstSet.getString("especie"));
					raca.setNomeRaca(rstSet.getString("nome_raca"));
					raca.setAlternativa(rstSet.getString("alternativa"));
					
					racas.add(raca);
				}
				rstSet.close();
			}
			pstmt.close();
		}
		conectaBancoDeDados.close();
	}
	return racas;
}

Obs.: é muito provável que exista uma maneira melhor de fazer isso, mas eu particularmente resolvi o problema assim.

williampereira21

Boa tarde amigo. consegui resolver de uma outra forma mas a sua me ajudou, segue o código:

EmpresaDao()
public Vector mostrarEmpresas() {

PreparedStatement ps = null;
    ResultSet rs = null;
    Connection con = ConnectionFactory.getConnection();

    Vector<Empresa> datos = new Vector<Empresa>();
    Empresa dat = null;
    try {

        String sql = "SELECT * FROM empresa";
        ps = con.prepareStatement(sql);
        rs = ps.executeQuery();

        dat = new Empresa();
        dat.setId_emp(0);
        dat.setNome_emp("Selecciona estado");
        datos.add(dat);

        while (rs.next()) {
            dat = new Empresa();
            dat.setId_emp(rs.getInt("id_emp"));
            dat.setNome_emp(rs.getString("nome_emp"));
            datos.add(dat);
        }
        rs.close();
    } catch (SQLException ex) {
        System.err.println("Error consulta :" + ex.getMessage());
    }
    return datos;
}

FuncionarioDAO:
public Vector mostrarFuncionario(int idEstado) {

PreparedStatement ps = null;
    ResultSet rs = null;
    Connection con = ConnectionFactory.getConnection();

    Vector<Funcionario> datos = new Vector<Funcionario>();
    Funcionario dat = null;
    try {

        String sql = "SELECT * FROM funcionarios WHERE id_emp=" + idEstado;
        ps = con.prepareStatement(sql);
        rs = ps.executeQuery();

        dat = new Funcionario();
        dat.setId_func(idEstado);
        dat.setNome("Seleccionar Funcionario");
        datos.add(dat);

        while (rs.next()) {
            dat = new Funcionario();
            dat.setId_func(rs.getInt("id_func"));
            dat.setNome(rs.getString("nome"));
            dat.setTelefone(rs.getString("telefone"));
            dat.setConexao(rs.getString("conexao"));
            datos.add(dat);
        }
        rs.close();
    } catch (SQLException ex) {
        System.err.println("Error consulta :" + ex.getMessage());
    }
    return datos;
}
ItemState do combo empresas:

private void jcombo_empItemStateChanged(java.awt.event.ItemEvent evt) {

if (evt.getStateChange() == ItemEvent.SELECTED) {

Empresa emp = (Empresa) jcombo_emp.getSelectedItem();

FuncionarioDAO func = new FuncionarioDAO();

DefaultComboBoxModel modelMunicipio = new DefaultComboBoxModel(func.mostrarFuncionario(emp.getId_emp()));

jcombo_func.setModel(modelMunicipio);

}

}
ItemState do combo Funcionarios:

private void jcombo_funcItemStateChanged(java.awt.event.ItemEvent evt) {

if (evt.getStateChange() == ItemEvent.SELECTED) {
Empresa emp = (Empresa) jcombo_emp.getSelectedItem();
        Funcionario func = (Funcionario) jcombo_func.getSelectedItem();
        
        lbEmp.setText(emp.getNome_emp());
        lbFunc.setText(func.getNome());
        lb_ConexFunc.setText(func.getConexao());
        lb_tel_func.setText(func.getTelefone());
     }
}
Criado 10 de agosto de 2019
Ultima resposta 20 de ago. de 2019
Respostas 4
Participantes 2