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.
Duvida sobre jcombobox
4 Respostas
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.
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, só que nesse caso só aparece o primeiro da lista indice 0 do array, sei que não é aqui que faz isso e sim no combo_func só 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());
}
}
}
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.
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());
}
}