MokaByte Numero 31  - Giugno 1999
Corso di Swing:
la pratica
di 
Massimo Carli
V parte


Dopo una lunga parte introduttiva dedicata al modello Model View Controller ed alla gestione degli eventi secondo il delegation model, vediamo adesso di toccare con mano qualche piccolo esempio dedicato alle Swing


La  prima applicazione Swing

Finalmente, dopo tanta fatica siamo arrivati alla realizzazione della nostra prima applicazione con le Swing. Come annunciato all'inizio della serie di articoli, creeremo una piccola applicazione che ci permetta di vedere quali sono i vari LookAndFeel disponibili dando la possibilità di passare tra uno e l'altro. 
Per fare questo esaminiamo nel dettaglio li Listato3_14.
 
1: package  corso.swing.capitolo3;
2: 
3: import javax.swing.JFrame;
4: import javax.swing.UIManager;
5: import javax.swing.JComboBox;
6: import javax.swing.JPanel;
7: import javax.swing.SwingUtilities;
8: 
9: 
10: 
11: import java.awt.Dimension;
12: import java.awt.Toolkit;
13: 
14: import java.awt.event.ActionListener;
15: import java.awt.event.ActionEvent;
16: 
17: /**
18: * Questa permette la visualizzazione di un piccolo JFrame
19: * all'interno del quale mettiamo una piccola choice attraverso
20: * la quale scegliamo il PL&F dello stesso.
21: *
22: *@author  Massimo Carli
23: *@version  0.1 (09/02/1999)
24: */
25: 
26: public class PlafJFrame  extends JFrame {
27: 
28: 
29: 
30:  /**
31:  * Crea il Frame e la relativa interfaccia grafica
32:  */
33:  public PlafJFrame(){
34:   super("PlafJFrame");
35:   /*
36:   * Prendiamo le informazioni relative ai L&F disponibili
37:   * utilizzando l'UIManager. Questo array verrà utilizzato
38:   * all'interno di una classe anonima per cui lo indichiamo
39:   * come final.
40:   */
41:   final UIManager.LookAndFeelInfo[] plaf_disponibili=UIManager.getInstalledLookAndFeels();
42:   /*
43:   * Creiamo una JChoice e inseriamo i plaf disponibili come 
44:   * scelte possibili. Creiamo un array con l'insieme dei
45:   * nomi dei vari LookAndFeel e lo utilizziamo per riempire
46:   * una JComboBox.
47:   */
48:   String[] nomi_plaf= new String[plaf_disponibili.length];
49:   for(int i=0;i<plaf_disponibili.length;i++)
50:    nomi_plaf[i]=plaf_disponibili[i].getName(); 
51:   JComboBox combo=new JComboBox(nomi_plaf);
52:   /*
53:   * La aggiungiamo al frame. E' buona norma non comporre
54:   * un'interfaccia grafica direttamente su un JFrame ma e'
55:   * bene creare un JPanel. Questo perchè, la stessa interfaccia
56:   * potrà essere inserita anche in un JApplet senza modifiche.
57:   * Il riferimento al JPanel ci serve anche nella classe
58:   * anonymous per cui lo mettiamo come final.
59:   */
60:   final JPanel panel= new JPanel();
61:   panel.add(combo);
62:   getContentPane().add(panel); 
63:   /*
64:   * Ascoltiamo la combo e di conseguenza modifichiamo il L&F.
65:   * Per fare questo creiamo una classe anonymous ascoltatrice.
66:   */
67:   combo.addActionListener(new ActionListener(){
68: 
69:    /*
70:    * Viene chiamato quando si fa una scelta attraverso
71:    * la JComboBox.
72:    */
73:    public void actionPerformed(ActionEvent e){
74:     /*
75:     * Prendiamo l'indice del valore selezionato
76:     */
77:     int indice=((JComboBox)(e.getSource())).getSelectedIndex();
78:     /*
79:     * Prendiamo il nome della classe corrispondente
80:     */
81:     String nome_classe_plaf=plaf_disponibili[indice].getClassName();
82:     /*
83:     * Modifichiamo il L&F. Per fare questo utilizziamo lo
84:     * UIManager. Per aggiornare l'interfaccia con il nuovo L&F 
85:     * utilizziamo i servizi della classe SwingUtilities.
86:     */
87:     try{
88:      UIManager.setLookAndFeel(nome_classe_plaf);
89:      SwingUtilities.updateComponentTreeUI(panel);
90:     }catch(Exception ex){
91:      System.out.println("Errore nell'installazione del L&F");
92:     }// fine try/catch
93:    }// fine metodo
94:   });// fine anonymous class
95:   setSize(200,80);
96:  }// fine costruttore
97: 
98: 
99: 
100:  /*
101:  * Ridefiniamo la setVisible per visualizzare il frame
102:  * al centro dello schermo
103:  *@param visible  Indica se mostrare o no il frame
104:  */
105:  public void setVisible(boolean visible){
106:   Dimension  dim_schermo=Toolkit.getDefaultToolkit().getScreenSize();
107:   int pos_x=(dim_schermo.width-getSize().width)/2;
108:   int pos_y=(dim_schermo.height-getSize().height)/2;
109:   setLocation(pos_x,pos_y);
110:   super.setVisible(visible);
111:  }// fine
112: 
113: 
114: 
115:  /*
116:  * Main dell'applicazione
117:  */
118:  public static void main(String str[]){
119:   PlafJFrame jframe= new PlafJFrame();
120:   jframe.setVisible(true);
121:  }// fine
122: 
123: 
124: 
125: }// fine classe
Il package della nostra applicazione è corso.swing.capitolo3 ovvero quello che raggruppa le classe relative al presente capitolo. Di seguito abbiamo importato le classi che utilizzeremo nell'applicazione. Abbiamo opportunamente elencato e diviso le varie classi per evidenziarle maggiormente. Il primo gruppo riguarda le classi del package javax.swing. Il primo termine, javax, indica che le Swing sono considerate una estensione delle Java core. Questo perché non sono necessarie alla creazione di una interfaccia grafica che si realizza anche con le sole AWT. Notiamo che le classi relative ai widget (JFrame, JComboBox, e JPanel) hanno un nome caratterizzato dalla J iniziale. Notiamo, inoltre, la presenza dell'UIManager, descritto nel capitolo precedente, e della classe SwingUtilities che raggruppa un insieme di funzioni di utilità nella gestione delle Swing. Il secondo gruppo di import è relativo ad alcune classi di utilità del package java.awt. Di maggiore importanza è il terzo gruppo di import che si riferisce alle classi ed interfacce utilizzate nella gestione degli eventi. L'evento che gestiremo sarà quello relativo ad una Action per cui, seguendo la regola dei nomi,  l'oggetto relativo all'evento stesso si chiamerà java.awt.event.ActionEvent e l'interfaccia degli ascoltatori java.awt.event.ActionListener. Il package java.awt.event raggruppa, infatti, le classi ed interfacce relative ai vari eventi.
Alla riga 26 vi è l'intestazione della classe. La nostra classe, PlafJFrame, estende un JFrame (che esamineremo meglio, come gli altri widget di questa semplice applicazione,  nei capitolo seguenti). Alla riga 33 inizia il costruttore che contiene la maggior parte del codice.  Alla riga 41 mettiamo un in array, l'insieme delle descrizioni relative ai L&F disponibili. Attraverso il metodo static getInstalledLookAndFeel() della classe UIManager si ottiene, infatti, un array di oggetti di tipo UIManager.LookAndFeelInfo che contengono le informazioni volute. Questo array ci sarà utile all'interno di una classe anonima per cui lo indichiamo come final (la cosa non disturba visto che il suo valore non cambia). Alla riga 48 mettiamo i nomi dei L&F disponibili in un array che utilizziamo per riempire un JComboBox. Se andiamo a vedere la documentazione della JComboBox, ci accorgiamo che essa è sorgente di un evento Action che notifica ai suoi ascoltatori ad ogni scelta. Creiamo allora, alla riga 67, un ascoltatore della combo attraverso una classe anonima. Essa dovrà semplicemente implementare il metodo actionPerformed() previsto dall'interfaccia ActionListener. Alla riga 77 prendiamo l'indice del nuovo elemento selezionato. Alla riga 81, utilizzando il precedente array delle informazioni relative ai vari L&F, prendiamo il nome della classe corrispondente al L&F. Alla riga 88, finalmente, abilitiamo il nuovo L&F attraverso il metodo static  setLookAndFeel() della classe UIManager. Questo non basta per modificare l'aspetto della nostra piccola applicazione. Per notificare a tutti i widget che devono aggiornare il loro Look, si utilizza il metodo static updateComponenteTreeUI() della classe SwingUtilities. Per completezza facciamo una piccola nota relativa al metodo setVisible(), ridefinito alla riga 105, per posizionare il JFrame al centro dello schermo.
 
 
 

Conclusioni

In questo impegnativo capitolo abbiamo approfondito gli aspetti di Java che più si utilizzano nella realizzazione di interfacce grafiche con le Swing. Abbiamo esaminato nel dettaglio i vari tipi di inner classes e visto come si programma utilizzando una gestione degli eventi per delega (Delegation Model). Abbiamo concluso con una piccola applicazione che mettesse in pratica sia gli aspetti relativi alla gestione del PluggableLookAndFeel (PLAF).

 
 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it