Fondamenti di informatica
Oggetti e Java
Luca Cabibbo
Interfacce grafiche
Capitolo 27
marzo 2004
1
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Interfacce grafiche
L’interfaccia grafica (o GUI, graphical user interface) di un
programma è basata su
 un insieme di elementi grafici – componenti
 componenti utilizzati per raggruppare altri componenti –
contenitori
 altri oggetti di supporto
 gestori di layout
 gestori degli eventi
2
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La tecnologia Swing
Le Swing delle API di Java
 package java.awt e javax.swing
 una GUI Swing è composta da
 un contenitore principale
 un pannello usato come contenitore intermedio
 componenti atomici
 altri oggetti di supporto
3
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Alcuni componenti Swing

contenitori principali
applet

finestra di dialogo
frame
contenitori intermedi
pannello (contiene altri componenti)

alcuni componenti atomici
etichetta
4
campi di testo
Interfacce grafiche
area di testo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe JFrame
Il contenitore principale per una interfaccia grafica può essere
 un applet
 una frame
 rappresentate dalla classe JFrame del package
javax.swing
 una finestra di dialogo
5
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Un esempio – una frame sullo schermo
import javax.swing.JFrame;
/* Applicazione che visualizza una frame sullo schermo. */
class FrameSemplice extends JFrame {
/* Crea una nuova FrameSemplice. */
public FrameSemplice() {
super();
this.setTitle("Una frame semplice");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
/* L'applicazione FrameSemplice. */
public static void main(String[] args) {
/* crea una nuova FrameSemplice */
new FrameSemplice();
}
}
6
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Componenti
I componenti di una interfaccia grafica sono oggetti
polimorficamente di tipo Component
 ciascuna tipologia di componente è rappresentata da una
sotto-classe di Component (JComponent)
 i componenti sono oggetti istanza di tali classi
 bottoni – classe JButton
 etichette – classe JLabel
 campi di testo – classe JTextField
 aree di testo – classe JTextArea
7
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio – la classe JTextField
Un campo di testo è un’area per visualizzare una linea di testo
editabile
 classe JTextField
 principali costruttori
 JTextField()
 JTextField(String s)
 JTextField(int n)
 principali metodi
 void setText(String s)
 String getText()
 String getSelectedText()
 void setEditable(boolean b)
8
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Struttura di una interfaccia grafica
import javax.swing.*;
/* L’applicazione Swing ApplicazioneX. */
public class ApplicazioneX extends JFrame {
... variabili d'istanza per i componenti
dell'interfaccia ...
... altre variabili d'istanza ...
... costruttore ...
... metodo per l'inizializzazione dell'interfaccia ...
... altri metodi ...
/* L'applicazione ApplicazioneX. */
public static void main(String[] args) {
/* crea ed avvia una nuova ApplicazioneX */
new ApplicazioneX();
}
}
9
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Costruttore per una interfaccia grafica
/* Crea una nuova ApplicazioneX. */
public ApplicazioneX() {
/* inizializza la frame */
super();
... altre inizializzazioni ...
/* inizializzazione dell’interfaccia grafica */
/* l'esecuzione dell'applicazione termina con
* la chiusura della frame */
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/* assegna un titolo alla frame */
this.setTitle("ApplicazioneX");
/* inizializza l'interfaccia dell'applicazione */
this.inizializzaGUI();
/* dimensiona e visualizza la frame */
this.pack();
this.show();
}
10
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Inizializzazione di una interfaccia grafica
/* Inizializza l'interfaccia grafica dell'applicazione
* e la gestione di eventi. */
private void inizializzaGUI() {
/* pannello, usato come contenitore intermedio */
JPanel intermedio;
/* crea il contenitore intermedio */
intermedio = new JPanel();
... crea il gestore di layout del contenitore
intermedio ...
... crea i componenti dell'interfaccia grafica ...
... crea gli ascoltatori di eventi ...
... aggiunge i componenti al contenitore
intermedio ...
/* aggiunge il contenitore intermedio alla frame */
this.getContentPane().add(intermedio);
}
11
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio – una frame con un bottone e una etichetta

variabili d’istanza per i componenti
private JButton bottone;
private JLabel etichetta;

// un bottone
// una etichetta
nel metodo inizializzaGUI()
/* crea i componenti dell'interfaccia */
bottone = new JButton("Un bottone");
etichetta = new JLabel("Una etichetta");
/* aggiunge i componenti al contenitore intermedio */
jPanel.add(bottone);
jPanel.add(etichetta);
12
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Gestori di layout
Per inserire un componente in un contenitore viene utilizzato il
metodo add(Component c)
 la posizione del componente del contenitore viene specificata
in modo indiretto e dipende
 gestore di layout associato al contenitore
13
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Gestori di layout
I gestori di layout sono oggetti polimorficamente di tipo
LayoutManager
 FlowLayout
 GridLayout


14
BorderLayout
GridBagLayout
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio – uso di un gestore di layout
/* Inizializza l'interfaccia grafica dell'applicazione,
* usando una griglia 3x2. */
private void inizializzaGUI() {
/* pannello usato come contenitore intermedio */
JPanel intermedio;
}
15
/* crea il contenitore intermedio */
intermedio = new JPanel();
/* crea il gestore di layout del contenitore intermedio */
intermedio.setLayout( new GridLayout(3,2) );
/* crea i componenti dell'interfaccia grafica */
bottone1 = new JButton("Uno");
bottone2 = new JButton("Due");
bottone3 = new JButton("Tre");
bottone4 = new JButton("Quattro");
bottone5 = new JButton("Cinque");
bottone6 = new JButton("Sei");
/* aggiunge i componenti al contenitore intermedio */
intermedio.add(bottone1);
intermedio.add(bottone2);
intermedio.add(bottone3);
intermedio.add(bottone4);
intermedio.add(bottone5);
intermedio.add(bottone6);
/* aggiunge il contenitore intermedio alla frame */
this.getContentPane().add(intermedio);
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Eventi, sorgenti e ascoltatori
Un evento rappresenta una interazione tra utente e GUI
 gli eventi sono oggetti polimorficamente di tipo EventObject
 ci sono diverse classi che estendono EventObject
 ad es., ActionEvent rappresenta eventi d’azione
Ogni evento viene generato con riferimento a un componente
della GUI, chiamato la sorgente dell’evento
Gli oggetti responsabili della gestione degli eventi sono chiamati
gestori (o ascoltatori) degli eventi
 polimorficamente di tipo EventListener
 ci sono diverse interfacce che estendono EventListener
 ad esempio, ActionListener
16
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Gestione di eventi
Si vuole realizzare una applicazione che conta quante volte è
stato premuto un bottone
17
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Premi il bottone – componenti
Variabili d’istanza
/* il bottone */
private JButton ilBottone;
/* etichetta per visualizzare quante volte è
* stato premuto ilBottone */
private JLabel etichettaContatore;
/* conta quante volte è stato premuto ilBottone */
private int contatore;
Nel costruttore
/* finora il bottone non è mai stato premuto */
this.contatore = 0;
18
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Premi il bottone – componenti
Nel metodo per l’inizializzazione della GUI
/* crea il bottone */
ilBottone = new JButton("Premimi!");
/* crea l'etichetta per visualizzare quante volte è
* stato premuto ilBottone */
etichettaContatore = new JLabel();
etichettaContatore.setText(
"Il bottone è stato premuto " +
this.contatore + " volte");

più avanti
/* aggiunge bottone e etichetta
* al pannello intermedio */
intermedio.add(ilBottone);
intermedio.add(etichettaContatore);
19
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Premi il bottone – ascoltatore
import java.awt.event.*;
/* Ascoltatore di eventi per l'applicazione
* PremiIlBottone. */
class AscoltatorePerPremiIlBottone
implements ActionListener {
/* Applicazione che usa l'ascoltatore */
private PremiIlBottone pib;
/* Crea un nuovo ascoltatore per l'applicazione pib. */
public AscoltatorePerPremiIlBottone(PremiIlBottone pib){
this.pib = pib;
}
/* Gestione degli eventi d'azione. */
public void actionPerformed(ActionEvent e) {
/* l'unico possibile evento d'azione è che sia
* stato premuto il bottone ilBottone di pib */
pib.conteggiaBottone();
}
}
20
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Premi il bottone – uso dell’ascoltatore
Nel metodo per l’inizializzazione dell’interfaccia grafica
/* ascoltatore per gli eventi d'azione */
ActionListener asc;

ed inoltre
/* crea un ascoltatore degli eventi di azione */
asc = new AscoltatorePerPremiIlBottone(this);
/* registra gli eventi di ilBottone */
ilBottone.addActionListener(asc);
21
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Premi il bottone – metodo per la gestione dell’evento
Nella classe PremiIlBottone
/* Il bottone ilBottone è stato premuto. */
public void conteggiaBottone() {
/* incrementa contatore */
this.contatore++;
/* aggiorna il valore visualizzato da
* etichettaContatore */
etichettaContatore.setText(
"Il bottone è stato premuto " +
this.contatore + " volte");
}
22
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Gestione di più sorgenti di eventi
Si consideri la seguente applicazione

23
come gestire due sorgenti di eventi?
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Un solo ascoltatore per più sorgenti di eventi
import java.awt.event.*;
/* Ascoltatore di eventi per ConvertitoreTemperature. */
class AscoltatorePerConvertitoreTemperature
implements ActionListener {
/* Applicazione che usa l'ascoltatore */
private ConvertitoreTemperature ct;
/* Crea un nuovo ascoltatore per l'applicazione ct. */
public AscoltatorePerConvertitoreTemperature
(ConvertitoreTemperature ct) {
this.ct = ct;
}
/* Gestione degli eventi d'azione. */
public void actionPerformed(ActionEvent e) {
/* sono possibili due eventi: è stato premuto il bottone
* bottoneACelsius o bottoneAFahrenheit di ct */
if (e.getSource()==ct.bottoneACelsius)
ct.aCelsius();
else if (e.getSource()==ct.bottoneAFahrenheit)
ct.aFahrenheit();
}
}
24
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodo per la gestione di un evento
/* Effettua una conversione a gradi Celsius. */
public void aCelsius() {
double f;
// temperatura in gradi Fahrenheit
double c;
// temperatura in gradi Celsius
/* legge la temperatura in gradi Fahrenheit */
f = new Double(campoTemperatura.getText())
.doubleValue();
/* converte la temperatura in gradi Celsius */
c = (f-32)/1.8;
/* visualizza la temperatura in gradi Celsius */
etichettaTemperaturaConvertita.setText(f + "F = " +
c + "C");
}
25
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Programmazione ad eventi
Lo sviluppo di applicazione interattive con GUI è basato sulla
programmazione ad eventi
 l’esecuzione delle operazioni svolte dall’applicazione è
controllata dalle azioni effettuate dall’utente
 uso estensivo del polimorfismo
 uso di framework
26
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Programmazione visuale
27
Interfacce grafiche
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl