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
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:
Riprendo quindi il problema e propongo una soluzione Java Swing molto semplice ed essenziale, lasciando agli studenti più motivati e volenterosi il compito di:
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----------------------------------------------------------------------------------