[Per corso su Java vedere http://java.sun.com/docs/books/tutorial/]
Java prevede nella sua API librerie di classi da usare in un programma per creare e gestire GUI. Parte delle Java Foundation Classes (JFC), librerie di classi standard Java.
In Java sia le finestre che gli elementi/dispositivi di interfaccia sono chiamati componenti.
Due librerie di componenti:
AWT e Swing hanno struttura e modo d'uso molto simile. Li vediamo entrambi parallelamente.
Le classi di componenti di AWT hanno equivalente in Swing. Componenti Swing si riconoscono perche' il nome inizia per "J" (es: Button e JButton).
import java.awt.*; import java.awt.event.*; public class AWTExample extends Frame { private static String labelPrefix = "Number of clicks: "; private int numClicks = 0; Label label = null; Button button = null; public AWTExample() { label = new Label(labelPrefix + "0 "); button = new Button("Click me!"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }); setLayout(new GridLayout(2, 1)); add(button); add(label); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pack(); setVisible(true); } public static void main(String[] args) { AWTExample app = new AWTExample(); } }
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingExample extends JFrame { private static String labelPrefix = "Number of clicks: "; private int numClicks = 0; JLabel label = null; JButton button = null; public SwingExample() { label = new JLabel(labelPrefix + "0 "); button = new JButton("Click me!"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }); Container panel = getContentPane(); panel.setLayout(new GridLayout(2, 1)); panel.add(button); panel.add(label); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pack(); setVisible(true); } public static void main(String[] args) { SwingExample app = new SwingExample(); } }Interfaccia di AWTExample e di SwingExample (dopo vari click):
I punti 3,4,5 sono eseguiti nel costruttore della classe AWTExample / SwingExample: l'interfaccia crea se stessa e parte. Il main semplicemente esegue la costruzione di un oggetto della classe.
Versione AWT:
Frame (finestra principale, contenitore) | +----+-----+ | | Button Label (bottone ed etichetta)Versione Swing:
JFrame (finestra principale, contenitore top-level) | content panel (contenitore intermedio) | +----+-----+ | | JButton JLabel (bottone ed etichetta)In un'interfaccia piu' complicata potrei avere piu' livelli nella gerarchia di contenimento.
Il layout manager stabilisce come sono posizionati i componenti dentro a un contenitore. Usiamo layout a griglia con 2 righe e 1 colonna.
L'istruzione pack fa si' che il contenuto della finestra venga compattato per occupare il minimo spazio necessario.
Per gestire evento "attivazione" (classe Actionevent) e' necessario definire una sotto-classe di ActionListener che implementi il metodo ActionPerformed eseguendo l'operazione desiderata. Poi creare un oggetto di tale classe ed associarlo al bottone.
Il tutto si puo' fare contemporaneamente: l'istruzione usata crea un oggetto ActionListener dove il metodo ActionPerformed e' ridefinito nel modo indicato (ActionPerformed e' l'unico metodo di ActionListener).
Analogamente per evento "chiusura" (classe WindowEvent) della
finestra.
Differenza: qui definisco sottoclasse di WindowAdapter invece che di
WindowListener perche' intendo riferinire solo il metodo
windowClosing (WindowListener ha anche altri metodi).
Esiste un adapter per ogni classe listener che prevede piu' di un
metodo. Le classi listener con un metodo solo non hanno bisogno di
adapter).