Come gestire select (combobox) dinamiche con Java

Propongo un programma Java Swing che permette di gestire le cosiddette select a cascata o select dinamiche delle tabelle MySql di regioni, province e comuni

Come nel programma Java Swing che visualizza i dati di una tabella MySql “contatti”, pubblicato  nella sezione “Esercizi Java” dell’Area Download di questo sito, si utilizzano le API di JDBC e il driver Connector/J mysql-connector-j-8.0.32.jar

java selectdinamiche

Selezionando la regione nella prima select (in Java Swing si utilizzano i componenti JComboBox), la seconda select viene popolata con le province della regione selezionata. Selezionando la provincia, la terza select viene popolata con i comuni della provincia selezionata. Nell’esempio in figura, selezionando l’Abruzzo tra le regioni italiane, la seconda select viene popolata con le provincie di Chieti, L’Aquila, Pescara e Teramo. Selezionando Teramo, la terza select viene popolata con i comuni della provincia di Teramo.

Il problema delle select dinamiche di tabelle MySql è molto ricorrente nella programmazione ed è già stato affrontato in questo sito con il linguaggio PHP. Nell’Area Download, sezione “Esercizi PHP”, sono presenti due soluzioni:

  1. “Select a cascata con MySql e Php”: realizzata con Php e pochissimo codice JavaScript è limitata alle select di province e comuni e prevede che la pagina venga ricaricata quando la select dei comuni è filtrata in base alla scelta della provincia (link),
  2. “Select dinamiche di regioni, province e comuni con Php, JQuery e Ajax”: realizzata in Php, jQuery e Ajax evita il refresh della pagina

Riprendo quindi il problema e propongo una soluzione Java Swing molto semplice ed essenziale, lasciando agli studenti più motivati e  volenterosi il compito di:

  • migliorare l'aspetto estetico con una gestione accurata dei layout 
  • utilizzare il codice all'interno di applicazioni più complesse recuperando ed elaborando i valori scelti nelle tre select dinamiche

Scarica la soluzione “java_mysql_selectdinamiche.rar “

(L'archivio compresso contiene il file mysql-connector-j-8.0.32.jar, il tutorial pdf, il codice Java e lo script regioni_province_comuni_sql che permette di importare le tabelle regioni, province e comuni nel database MySql)

 

Codice java

/*
 * Come gestire con Java  select dinamiche di tabelle MySql 
 *  Prof. Mauro De Berardis Aprile 2023     
 */
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.*; 
import javax.swing.*;
public class SelectDinamiche extends JFrame implements ItemListener{
	private final static String url = "jdbc:mysql://localhost:3306/tabelle";
	// 3306 numero di porta standard di localhost
	//tabelle è il Database MySql dove si trovano le tabelle: regioni, province e comuni
	private final static  String userid = "root";
	private final static  String password = "";
	JLabel m1=new JLabel("Regione selezionata: ");
	JLabel m2=new JLabel("Provincia selezionata: ");
	JLabel m3=new JLabel("Comune selezionato: ");
	JComboBox creg=new JComboBox(); //comboBox delle regioni
  	JComboBox cprov=new JComboBox();//comboBox delle province
	JComboBox ccom=new JComboBox();//comboBox dei comuni
	public int idregione,idprovincia,idcomune;
	public Connection conn;
 
	public SelectDinamiche() {
		Container c=this.getContentPane();
		JPanel pcombo=new JPanel(new GridLayout(3,1));
		pcombo.add(creg);
		pcombo.add(cprov);
		pcombo.add(ccom);
		c.add(pcombo, BorderLayout.NORTH);
	   	JPanel pmessaggi=new JPanel(new GridLayout(3,1));
	   	pmessaggi.add(m1);pmessaggi.add(m2);pmessaggi.add(m3);
	    c.add(pmessaggi, BorderLayout.SOUTH);
	    creg.addItemListener(this);
	    cprov.addItemListener(this);
	    ccom.addItemListener(this);
 
		try{
			Class.forName("com.mysql.cj.jdbc.Driver");
			// carica la classe principale, denominata com.mysql.cj.jdbc.Driver del Driver .
			conn = DriverManager.getConnection(url, userid, password);
			if (conn != null) {
					System.out.println("Connesso al DB MySql");
				} else {
					System.out.println("Errore");
				}
			// Recupero tutte le righe della tabella regioni in ordine alfabetico
			// e popolo la comboBox creg con i nomi delle regioni
			Statement st = conn.createStatement();
			ResultSet rs = st.executeQuery("SELECT * FROM regioni order by nome");
			creg.removeAllItems();
			creg.addItem("Seleziona la regione");
			while(rs.next()){
				creg.addItem(rs.getString("nome"));
				}
 
	  		}catch (SQLException | ClassNotFoundException sqlException) {
            sqlException.printStackTrace();
  		}
	  	this.setTitle("Select dinamiche - Prof. Mauro De Berardis 2023");
	 	this.setSize(500, 300);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}	// chiude costruttore
 
	public static void main(String[] args) {
		new SelectDinamiche();
	}
 
	@Override
	public void itemStateChanged(ItemEvent e) {
 
	     if (e.getSource() == creg) {
              String regionesel=creg.getSelectedItem().toString();
              m1.setText("Regione selezionata: "+regionesel);
 
          	try{
          		 // recupero il codice della regione selezionata  		
          		 // PreparedStatement impedisce la SQL Injection e permette di gestire correttamente 
                 // parametri contenenti caratteri accentati 
          		 PreparedStatement prest1 = conn.prepareStatement("SELECT codice from  regioni where nome= ?");
                 prest1.setString(1,regionesel);
                 ResultSet rs1 = prest1.executeQuery();
 
             	while(rs1.next()){
    			      idregione=rs1.getInt("codice");
    				 }
                // Recupero le righe della tabella province  in ordine alfabetico
    			// della regione selezionata e popolo la comboBox cprov con i nomi delle province
                Statement st = conn.createStatement();
                ResultSet rs2 = st.executeQuery("SELECT * FROM province where codice_regione="+idregione+" order by nome");
                cprov.removeAllItems();
                cprov.addItem("Seleziona la provincia");
                while(rs2.next()){
                	cprov.addItem(rs2.getString("nome"));
  				}
 
       		}catch (SQLException sqlException) {
                sqlException.printStackTrace();
      		}
          	 if(creg.getSelectedIndex()==0){ // se seleziono Scegli la regione.....
          		m1.setText("Regione selezionata: ");
          		m2.setText("Provincia selezionata: ");
          		m3.setText("Comune selezionato: ");
          		 cprov.removeAllItems();
				 cprov.addItem("Seleziona la provincia");
				 ccom.removeAllItems();
				 ccom.addItem("Seleziona il comune");
			 }
 
        } // chiude ==creg------------------------------------
 
		 if (e.getSource() == cprov) {
			 if(cprov.getSelectedIndex() >0) {  
			  String provinciasel=cprov.getSelectedItem().toString();
              m2.setText("Provincia selezionata: "+provinciasel);
              try{
          		 // recupero il codice della provincia selezionata
           		 // PreparedStatement impedisce la SQL Injection e permette di gestire correttamente 
                 // parametri contenenti caratteri accentati 
            	   PreparedStatement prest2 = conn.prepareStatement("SELECT codice from  province where nome= ?");
                   prest2.setString(1,provinciasel);
                   ResultSet rs3 = prest2.executeQuery();
                 	while(rs3.next()){
        			      idprovincia=rs3.getInt("codice");
        			 	}
                 	// Recupero le righe della tabella comuni in ordine alfabetico
        			// della provincia selezionata e popolo la comboBox ccom con i nomi dei comuni
                    Statement st = conn.createStatement();
                    ResultSet rs4 = st.executeQuery("SELECT * FROM comuni where codice_provincia="+idprovincia+" order by nome");
                    ccom.removeAllItems();
                    ccom.addItem("Seleziona il comune");
                    while(rs4.next()){
                    	ccom.addItem(rs4.getString("nome"));
      					}
 
      	  		}catch (SQLException sqlException) {
                  sqlException.printStackTrace();
        		}
 
            }
			 if(cprov.getSelectedIndex()==0){ // se seleziono Scegli la provincia.....
				 m2.setText("Provincia selezionata: ");
	          		m3.setText("Comune selezionato: ");
				 ccom.removeAllItems();
				 ccom.addItem("Seleziona il comune");
			 }
		 } // chiude ==cprov-------------------------------
 
		if (e.getSource() == ccom) {
		 if(ccom.getSelectedIndex() >0) {
			 String comunesel=ccom.getSelectedItem().toString();
        	m3.setText("Comune selezionato: "+comunesel);}
	 	}// chiude ==ccom-------------------------------
 
	}// chiude itemStateChanged---------------------------------------
 
}// chiude la classe SelectDinamiche----------------------------------------------------------------------------------