JComboBox

Como detectar uma mudança no JComboBox em tempo real?
Estou fazendo dois ComboBox com Sala e nome dos alunos de uma determinada sala, como faço pra quando eu selecionar uma sala no primeiro combobox ele automaticamente carregar os alunos desta sala?

A isso dá-se o nome de combobox encadeados.
Os dados estão vindo de onde? Banco de dados? Como estão os seus métodos para popular os comboboxes?

Um trecho de código que tenho aqui…

1 - Pacote DAO

public static List<bean.Raca> pesquisar(short 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.getLong("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;
    }

2 - Pacote View

private static final short NUMERO_MINIMO_REGISTROS = 3;

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

private void carregarComboRacas(short parametro, String argumento){
	try{
		racas = dao.Raca.pesquisar(parametro, argumento);
		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());
	}
}

image