Anda di halaman 1dari 20

Elementi dellinterfaccia utente Swing: Finestre Top Level

Premessa
Una finestra top level (di massimo livello) una finestra dotata di barra del titolo e bordi e
non contenuta in altre finestre. Ogni applicazione ha bisogno di una finestra di questo
tipo che funga da contenitore per tutti gli altri componenti dellinterfaccia utente.
La dispensa mostra alcuni metodi alternativi per creare una finestra top level mediante
scrittura diretta del codice e utilizzando il tool visuale Window Builder (integrato in Eclipse
LUNA). In particolare si vedr come creare una finestra con titolo, icona personalizzata e
centrata nello schermo del computer.
Indice
Gerarchia di classi coinvolte
Costruttori della classe JFrame
Propriet basilari di una finestra top level
Creazione di una finestra top level nel main
Creazione di una classe che definisce una finestra top level
Una variante: il metodo initialize
Posizionamento di una finestra e icona personalizzata: la classe Toolkit
Altre propriet di una finestra top level
Il problema dei metodi non thread safe
Creazione di una finestra top level con Window Builder
Videolezioni
Java Swing Creare finestre top level Parte 1
Java Swing Creare finestre top level Parte 2
Java Swing Creare finestre top level Parte 3
Java Swing Creare finestre top level Parte 4

Bocchi Cinzia

10/01/2015

Gerarchia di classi coinvolte

Figura 1 Classi utilizzate per creare una finestra top level

La figura 1 mostra le principali classi coinvolte nella creazione di una finestra top level.
Una finestra top level viene creata come istanza della classe JFrame. Vediamo, allora,
alcuni costruttori di tale classe.

Bocchi Cinzia

10/01/2015

Alcuni costruttori della classe JFrame


public JFrame()
Crea una finestra senza titolo e non visibile.

public JFrame(String title)


Crea una finestra non visibile, con il titolo specificato.

La finestra creata ha le seguenti caratteristiche:


ridimensionabile mediante il pulsante presente sulla barra del titolo;
riducibile a icona mediante il pulsante presente sulla barra del titolo;
dimensionabile con il mouse, agendo sul contorno.

Propriet basilari di una finestra top level


Prima di creare una finestra top level occorre stabilire i valori delle seguenti propriet:
1. il titolo che apparir nella barra del titolo;
2. la dimensione, cio la sua larghezza (width) e la sua altezza (height) in pixel;
3. la posizione a partire dalla quale sar visualizzata, cio lascissa e lordinata del
vertice superiore sinistro;
4. loperazione associata al pulsante di chiusura.
I metodi coinvolti nella impostazione di tali propriet sono riassunti nella seguente tabella.
Classe
java.awt.Frame

Metodo
public void setTitle(String title)
Imposta il titolo del frame alla stringa passata come parametro. Il titolo
pu essere impostato anche in fase di creazione dellistanza con il
costruttore JFrame(String title).

java.awt.Window

public void setSize(int width, int height)


Imposta la larghezza (width) e laltezza (height) della finestra;
larghezza e altezza sono espressi in pixel.

java.awt.Window

public void setLocation(int x, int y)


Posiziona la finestra a partire dal punto di coordinate (x, y). Il vertice
superiore sinistro della finestra coincide con il punto di coordinate
specificate. Se non indicato, la finestra viene posizionata nellorigine
degli assi (vertice superiore sinistro dello schermo).

java.awt.Window

public void setBounds(int x, int y, int width, int


height)
Combina i metodi setLocation e setSize, consentendo di impostare
la posizione iniziale e la dimensione della finestra con un'unica
operazione.

Bocchi Cinzia

10/01/2015

javax.swing.JFrame public void setDefaultCloseOperation(int operation)


Specifica l'operazione da eseguire quando si fa clic sul pulsante di
chiusura della finestra (il pulsante con la X). Il parametro operation
pu assumere uno dei seguenti valori:
EXIT_ON_CLOSE - costante di JFrame; chiude la finestra e
termina lapplicazione.
DISPOSE_ON_CLOSE - costante dell'interfaccia
WindowConstants; chiude la finestra, liberando le risorse di
sistema, ma senza interrompere l'esecuzione.
DO_NOTHING_ON_CLOSE - costante di WindowConstants; non
esegue alcuna azione.
HIDE_ON_CLOSE - costante di WindowConstants; nasconde la
finestra ( il valore di default).

Creazione di una finestra top level nel main


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

import javax.swing.JFrame;
public class MyFrame {
public static void main(String[] args) {
final
final
final
final

int
int
int
int

WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;

//Creare l'istanza della classe JFrame


JFrame frame = new JFrame("MyFrame");
//Impostare la dimensione del frame
frame.setSize(WIDTH, HEIGHT);
//Impostare la posizione del frame
frame.setLocation(X, Y);
//Impostare l'operazione associata al pulsante di chiusura
del frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Rendere il frame visibile
frame.setVisible(true);
}
}
MyFrame versione 1

Bocchi Cinzia

10/01/2015

righi 07-10
Costanti simboliche che contengono rispettivamente i valori interi della larghezza e
dellaltezza della finestra, dellascissa e dellordinata del suo vertice superiore sinistro.
rigo 13
Crea una finestra top level come istanza della classe JFrame e le assegna il titolo
MyFrame.
rigo 16
Imposta la larghezza della finestra a WIDTH pixel e laltezza a HEIGHT pixel.
rigo 19
Posiziona il vertice superiore sinistro della finestra nel punto di coordinate (X, Y).
rigo 23
Associa al pulsante di chiusura della finestra loperazione che termina lapplicazione.
rigo 26
Visualizza la finestra.

Creazione di una classe che definisce una finestra top level


Possiamo creare una classe MyFrame che estende la classe JFrame. Le propriet della
finestra devono essere impostate nel costruttore di MyFrame e, nella classe, deve essere
definito un metodo main per creare la finestra e renderla visibile.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23

import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MyFrame extends JFrame {

Bocchi Cinzia

public
public
public
public

static
static
static
static

final
final
final
final

int
int
int
int

WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;

public MyFrame() {
//Impostare il titolo della finestra
setTitle("MyFrame");
/*In alternativa
* super("MyFrame");
*/
//Impostare la dimensione della finestra
setSize(WIDTH, HEIGHT);
//Impostare la posizione iniziale
10/01/2015

24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

setLocation(X, Y);
/*In alternativa a setSize + setLocation
* setBounds(X, Y, WIDTH, HEIGHT);
*/
//Impostare l'operazione associata al pulsante di chiusura
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
}
MyFrame versione 2

rigo 03
Sopprime il warning riferito alla mancata serializzazione. La serializzazione utilizzata per
gli oggetti persistenti o in altre situazioni che, al momento, non ci interessano.
righi 06-09
Le costanti di classe WIDTH, HEIGHT, X e Y rappresentano rispettivamente la larghezza e
laltezza del frame e le coordinate del suo vertice superiore sinistro.
righi 13-18
Il costruttore della classe MyFrame esegue una chiamata al metodo setTitle per
impostare il titolo della finestra. In alternativa, possibile chiamare il costruttore della
superclasse JFrame, specificando come parametro il titolo del frame, utilizzando:
super("MyFrame").
rigo 21
Il metodo setSize imposta la dimensione del frame.
rigo 24
Il metodo setLocation imposta la posizione iniziale del frame; la posizione, se non
specificata, coincide con il punto origine degli assi.
rigo 27
Al posto dei metodi setSize e setLocation si pu usare il metodo setBounds: esso
effettua le due operazioni contemporaneamente.
rigo 31
La chiamata al metodo setDefaultCloseOperation imposta loperazione associata al
pulsante di chiusura del frame.
righi 35-37

Bocchi Cinzia

10/01/2015

Tra i metodi della classe presente il metodo main: in tal modo possibile testare il
funzionamento della classe, senza dover scrivere una specifica applicazione. Qualora si
scriva invece, un'applicazione che utilizza la classe MyFrame, il metodo main presente
nell'applicazione, prevarr su quello definito nella classe stessa.
Una volta creata la finestra, questa non ancora visibile. Per visualizzarla occorre
chiamare il metodo setVisible, passandogli come parametro true. La visualizzazione di
una finestra deve avvenire dopo che tutte le impostazioni iniziali sono state applicate.

Una variante: il metodo initialize


In alcuni esempi il codice che si occupa dellinizializzazione della finestra viene racchiuso
in un metodo privato, invece che nel costruttore della classe. Il costruttore si limita,
pertanto, ad invocare tale metodo. Vediamo le modifiche apportate al precedente codice.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MyFrame extends JFrame {

Bocchi Cinzia

public
public
public
public

static
static
static
static

final
final
final
final

int
int
int
int

WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;

public MyFrame() {
initialize();
}
private void initialize() {
//Impostare il titolo della finestra
setTitle("MyFrame");
//Impostare la dimensione della finestra
setSize(WIDTH, HEIGHT);
//Impostare la posizione iniziale
setLocation(X, Y);
//Impostare l'operazione associata al pulsante di chiusura
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
10/01/2015

35
36

}
MyFrame versione 3

Posizionamento di una finestra e icona personalizzata: la classe Toolkit


La classe astratta Toolkit fornisce una interfaccia verso la piattaforma in uso, consentendo
di ottenere informazioni su, ad esempio, la dimensione di una finestra, i font disponibili, e
cos via. Toolkit consente, pertanto, di risolvere i problemi di visualizzazione dovuti alle
caratteristiche specifiche della piattaforma. Ogni piattaforma che supporta Java deve
fornire una classe concreta che estende la classe Toolkit.
Nonostante Java sia indipendente dalla piattaforma, pu capitare che a parit di bytecode,
di sistema operativo e di JDK, linterfaccia utente appaia diversa. Questo problema
dovuto alla risoluzione dello schermo che pu variare a seconda della scheda video in uso
e in base alle preferenze dellutente. Per esempio, un frame di dimensioni 800x600
potrebbe essere troppo grande per uno schermo con risoluzione 640x480 e troppo piccolo
per uno schermo con risoluzione 1024x768.
La maggior parte dei metodi della classe Toolkit sono chiamati dal sistema, ma esistono
alcuni metodi che risultano particolarmente utili e che andiamo ad analizzare di seguito.
Alcuni metodi della classe java.awt.Toolkit
public static Toolkit getDefaultToolkit()
Restituisce il toolkit predefinito.

public abstract Image getImage(String filename)


Carica unimmagine dal file specificato. I formati immagine consentiti sono GIF, JPG e PNG.

public abstract Image getImage(URL url)


Carica una immagine dallurl specificato. I formati immagine consentiti sono GIF, JPG e PNG.

public abstract Dimension getScreenSize()


Restituisce le dimensioni dello schermo dellutente.

Vediamo ora, nel dettaglio, le operazioni necessarie per posizionare la finestra


centralmente nello schermo e per associare ad essa unicona personalizzata.
Posizionare centralmente la finestra nello schermo
Toolkit kit = Toolkit.getDefaultToolkit();
Il metodo statico getDefaultToolkit restituisce nella variabile kit il riferimento al toolkit
di default.

Bocchi Cinzia

10/01/2015

Dimension screenSize = kit.getScreenSize();


Il metodo getScreenSize restituisce un oggetto Dimension contenente le dimensioni
dello schermo.
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
Un oggetto Dimension ha due variabili di istanza pubbliche intere width e height che
contengono rispettivamente la larghezza e laltezza dellelemento considerato. Di
conseguenza, basta accedere ad esse in lettura per ottenere la larghezza e laltezza dello
schermo. Dopo le assegnazioni, screenWidth contiene la larghezza dello schermo e
screenHeight la sua altezza.
int x = (screenWidth - WIDTH) / 2;
int y = (screenHeight - HEIGHT) / 2;
setLocation(x, y);
Ora che conosciamo altezza e larghezza dello schermo, eseguiamo un semplice calcolo
per ottenere le coordinate del vertice superiore sinistro del frame e impostare la sua
posizione iniziale con setLocation.
Personalizzare licona della finestra
Per prima cosa occorre salvare limmagine, per esempio icon.gif, dentro al package del
progetto Eclipse. Successivamente sufficiente eseguire il codice seguente.
Image img = kit.getImage(getClass().getResource("icon.gif"));
consente di reperire una risorsa collocata allinterno dello stesso package di MyFrame. Nel
dettaglio:

getClass restituisce il tipo runtime delloggetto: class nome_package.MyFrame,


getResource restituisce lurl della risorsa che ha il nome specificato, cio di icon.gif.

La combinazione dei due metodi consente di ottenere il seguente URI:


file:/unit:/nome_workspace/nome_progetto/bin/nome_package/icon.gif
che corrisponde alla effettiva collocazione della risorsa.

getImage crea loggetto Image a partire dal file immagine.

setIconImage(img);
Il metodo setIconImage, infine, imposta limmagine come icona della finestra.
Vediamo il codice completo.

Bocchi Cinzia

10/01/2015

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

import
import
import
import

java.awt.Dimension;
java.awt.Image;
java.awt.Toolkit;
javax.swing.JFrame;

@SuppressWarnings("serial")
public class MyFrame extends JFrame {
public static final int WIDTH = 450;
public static final int HEIGHT = 300;
public MyFrame() {
initialize();
}
private void initialize() {
//Impostare il titolo della finestra
setTitle("MyFrame");
//Impostare la dimensione della finestra
setSize(WIDTH, HEIGHT);
//Impostare la posizione iniziale centrata nello schermo
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
int x = (screenWidth - WIDTH) / 2;
int y = (screenHeight - HEIGHT) / 2;
setLocation(x, y);
//Aggiungere un'icona personalizzata alla finestra
Image img =
kit.getImage(getClass().getResource("duke_icon.jpg"));
setIconImage(img);
//Impostare l'operazione associata al pulsante di chiusura
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
}
MyFrame versione 4

Bocchi Cinzia

10/01/2015

10

La figura seguente mostra la finestra generata dal precedente codice.

Figura 2 La finestra top level generata con il codice MyFrame versione 4

Altre propriet di una finestra top level


Nel seguito sono riportati alcuni metodi utili per impostare ulteriori propriet di una finestra
top level.
Classe

Metodo

java.awt.Component public int getHeight()


Restituisce l'altezza del componente.

java.awt.Component public int getWidth()


Restituisce la larghezza del componente.

java.awt.Component public int getX()


Restituisce l'ascissa del vertice superiore sinistro del componente.

java.awt.Component public int getY()


Restituisce lordinata del vertice superiore sinistro del componente.

java.awt.Component public boolean isEnabled()


Restituisce true se il componente abilitato; false altrimenti. Un
componente abilitato pu rispondere allinput dellutente e genera
eventi. I componenti vengono creati abilitati, per default.

java.awt.Component public boolean isVisible()


Restituisce true se il componente visibile quando lo il componente
genitore (quello che lo contiene); false altrimenti.

Bocchi Cinzia

10/01/2015

11

java.awt.Component public void setEnabled(boolean b)


Se b uguale true, abilita il componente, altrimenti lo disabilita.

java.awt.Component public String toString()


Restituisce una rappresentazione del componente sotto forma di
stringa.

java.awt.Window

public void dispose()


Chiude la finestra e libera tutte le risorse di sistema da essa occupate.

java.awt.Window

public Color getBackground()


Restituisce il colore di sfondo della finestra.

java.awt.Window

public boolean isAlwaysOnTop()


Restituisce true se la finestra sempre in primo piano, false
altrimenti. Nel caso ci siano pi finestre always on top, il loro ordine
dipende dalla piattaforma in uso.

java.awt.Window

public boolean isAutoRequestFocus()


Restituisce true se la finestra riceve automaticamente il focus quando
viene resa visibile o quando viene portata in primo piano, false
altrimenti. Il valore di default di questa propriet true.

java.awt.Window

public void pack()


Visualizza la finestra determinandone automaticamente la dimensione
sulla base della dimensione dei suoi componenti.

java.awt.Window

public void setAlwaysOnTop(boolean b)


Se b uguale true, imposta la finestra come finestra always on top,
cio sempre in primo piano. Si veda il metodo isAlwaysOnTop.

java.awt.Window

public void setVisible(boolean b)


Se b uguale true, rende visibile la finestra, mentre la nasconde se b
uguale a false.

java.awt.Window

public void setAutoRequestFocus(boolean b)


Se b uguale true, la finestra riceve automaticamente il focus ogni
volta che viene resa visibile o che viene portata in primo piano. Si veda
il metodo isAutoRequestFocus.

java.awt.Frame

public String getTitle()


Restituisce il titolo del frame.

java.awt.Frame

public boolean isResizable()


Restituisce true se il grame pu essere ridimensionato dallutente,
false altrimenti.

java.awt.Frame

public void setBackground(Color bgColor)


Imposta il colore di sfondo del frame al colore specificato.

java.awt.Frame

public void setResizable(boolean b)


Se b uguale true, rende il frame ridimensionabile dallutente.

Bocchi Cinzia

10/01/2015

12

java.awt.JFrame

public Container getContentPane()


Le finestre create con JFrame contengono al loro interno un certo
numero di pannelli predefiniti, uno dei quali il pannello del contenuto
(contentPane). Qualsiasi componente pu essere aggiunto
direttamente solo a questo pannello predefinito. Il metodo
getContentPane restituisce il riferimento (indirizzo) a tale pannello.

java.awt.JFrame

public int getDefaultCloseOperation()


Restituisce un intero che specifica loperazione associata al pulsante di
chiusura del frame. Conosciamo gi le costanti intere simboliche che
consentono di indicare tale operazione, ma pu essere utile sapere
qual il loro effettivo valore:
EXIT_ON_CLOSE ha valore 3
DISPOSE_ON_CLOSE ha valore 2
DO_NOTHING_ON_CLOSE ha valore 0
HIDE_ON_CLOSE ha valore 1
Si veda il seguente link alla documentazione Java.

java.awt.JFrame

public void setIconImage(Image image)


Imposta limmagine specificata come icona del frame.

Il problema dei metodi non thread safe


Un programmatore Java pu organizzare un singolo programma suddividendo il codice in
operazioni che possono essere svolte in parallelo. In realt se il sistema
monoprocessore, il parallelismo solo virtuale, ma lutente non nota la differenza. Tali
operazioni vengono dette thread e i programmi che sono in grado di eseguire pi di un
thread alla volta sono detti multithread. I thread multipli non devono essere confusi con i
processi multipli, che sono gestiti dal sistema operativo e che dispongono di unarea di
memoria privata, separata da tutti gli altri. I thread sono gestiti dal programmatore e
condividono gli stessi dati.
I thread sono utilizzati per rendere i programmi pi efficienti e veloci nella risposta. Nello
specifico, quando si realizzano applicazioni con interfaccia utente grafica e il programma
deve svolgere unoperazione che richiede tempo, meglio attivare un thread dedicato a
svolgere quel lavoro. Diversamente, lutente non potr interagire con linterfaccia grafica
fino a quando loperazione non sar terminata.
Purtroppo, per, Swing non sicuro quando si tratta di gestire dei thread: la maggior
parte dei metodi di Swing non sincronizzata e questo pu causare il danneggiamento
dellinterfaccia. Di conseguenza, necessario attenersi ad alcune regole presenti nelle
specifiche Java. Prima di esaminare tali regole, vediamo quali tipologie di thread sono
presenti in un programma Swing.
Tipologie di thread in un programma Swing
Thread principale (initial thread): esegue il codice presente nel metodo main.
In un programma Swing il metodo main si limita solitamente a chiamare il costruttore che
crea la finestra principale, disponendone allinterno i suoi componenti, e poi chiama il
Bocchi Cinzia

10/01/2015

13

metodo setVisible o pack per visualizzarla. Di solito, il metodo main, a questo punto,
termina e il thread principale cede il controllo.
Thread di comunicazione dellevento (event dispatch thread, EDT): esegue il codice
che gestisce gli eventi.
Questo thread viene creato appena appare la prima finestra. Gli eventi consistono
prevalentemente in eventi di aggiornamento che causano il ridisegno dei componenti
dellinterfaccia utente o eventi di input generati mediante tastiera o mouse. La maggior
parte dei metodi Swing devono essere eseguiti dallEDT perch alcuni metodi, detti non
thread safe, se eseguiti in altri thread possono danneggiare linterfaccia utente.
Altri metodi Swing, invece, sono thread safe e possono essere eseguiti in qualsiasi thread:
- i metodi repaint, revalidate, invalidate di JComponent;
- tutti i metodi del tipo addXXXListener e removeXXXListener;
- tutti i metodi esplicitamente documentati come thread safe.
Di conseguenza, nella maggior parte dei casi, quando si vuole aggiornare lo stato visivo
dei componenti dellinterfaccia utente consigliabile utilizzare EDT.
Thread di lavoro (worker thread o background thread): eseguono in background
elaborazioni considerate costose in termini di tempo e sono definiti dal programmatore.
Se unoperazione richiede molto tempo per essere completata, eseguirla nellEDT blocca
la GUI per tutta la durata delloperazione stessa e lutente non pu interagire con essa.
Per tale motivo questo tipo di elaborazioni vengono realizzate fuori dallEDT su un worker
thread.
Regole da seguire in unapplicazione Swing
1) Se unazione richiede molto tempo occorre attivare un nuovo thread per eseguirla, cos
da non bloccare lEDT, impedendo allinterfaccia di rispondere agli eventi dellutente.
Analogamente, occorre creare un nuovo thread se unoperazione pu bloccarsi su un
input o un output.
2) Se necessario attendere per un certo tempo meglio non bloccare lEDT ma
utilizzare un timer.
3ue Questultima regola chiamata anche regola del singolo thread.
La regola del singolo thread non vale per i metodi che utilizzano i thread in modo sicuro.
Inoltre, si tenga presente che uninterfaccia pu sempre essere modificata dallEDT fino a
quando nessuno dei componenti stato realizzato, cio fino a quando non viene chiamato
il metodo setVisible o pack.
La regola del singolo thread molto restrittiva, ma possibile aggirarla, grazie a due
metodi della classe EventQueue.
Regola del singolo thread e la classe EventQueue
La classe java.awt.EventQueue definisce due metodi statici, invokeLater e
invokeAndWait, che possono aggiungere operazioni alla coda di eventi per far s che
vengano eseguite nellEDT. Questi metodi sono presenti anche nella classe
javax.swing.SwingUtilities.
Bocchi Cinzia

10/01/2015

14

Il codice necessario per richiamarli il seguente:


EventQueue.invokeLater(new Runnable() {
public void run() {
//codice che aggiorna linterfaccia
}
});

EventQueue.invokeAndWait(new Runnable() {
public void run() {
try {
//codice che aggiorna linterfaccia
} catch (Exception e) {
e.printStackTrace();
}
}
});

public static void invokeLater(Runnable runnable)


Esegue il metodo run nel thread di comunicazione degli eventi (EDT), dopo che gli eventi in attesa
sono stati elaborati. Restituisce il controllo non appena levento viene inserito nella coda di eventi.

public static void invokeAndWait(Runnable runnable)


Esegue il metodo run nel thread di comunicazione degli eventi (EDT), dopo che gli eventi in attesa
sono stati elaborati. Si blocca fino a quando il metodo run non terminato. Pu generare delle
eccezioni controllate e, pertanto, il codice deve essere racchiuso in un blocco try catch.

Possiamo migliorare il codice della classe MyFrame inserendo il codice del metodo main
dentro al metodo run, come mostrato nel seguente esempio.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17

import java.awt.EventQueue;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MyFrame extends JFrame {

Bocchi Cinzia

public
public
public
public

static
static
static
static

final
final
final
final

int
int
int
int

WIDTH = 450;
HEIGHT = 300;
X = 100;
Y = 100;

public MyFrame() {
initialize();
}
10/01/2015

15

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

private void initialize() {


//Impostare il titolo della finestra
setTitle("MyFrame");
//Impostare la dimensione della finestra
setSize(WIDTH, HEIGHT);
//Impostare la posizione iniziale
setLocation(X, Y);
//Impostare l'operazione associata al pulsante di chiusura
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
}
MyFrame versione 5

Creazione di una finestra top level con Window Builder


WindowBuilder uno strumento integrato in Eclipse Luna per la creazione visuale di
interfacce utente. Per creare una finestra top level allinterno di un progetto occorre
New/Other dal menu File. Nella finestra che appare scegliere Application Window,
come mostrato in figura 3. Successivamente, specificare il nome dellapplicazione, come
mostrato in figura 4 e fare clic su Finish.
Il tool genera automaticamente il codice dellapplicazione. Vedremo che il codice generato
molto simile a quello descritto negli esempi precedenti.

Bocchi Cinzia

10/01/2015

16

Figura 3 Creazione di unapplication window

Figura 4 Nome dellapplicazione

Bocchi Cinzia

10/01/2015

17

Di seguito il codice prodotto da Window Builder.


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

mport java.awt.EventQueue;
import javax.swing.JFrame;
public class MyFrame {
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyFrame window = new MyFrame();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MyFrame() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
MyFrame versione Window Builder

Bocchi Cinzia

10/01/2015

18

A questo punto possiamo intervenire direttamente sul codice per modificare alcune
propriet del frame e per aggiungere componenti, oppure possiamo utilizzare la scheda
Design per effettuare tutte queste operazione in modo visuale.

Figura 5 La scheda Design di Window Builder

Selezionando il frame con un clic del mouse, sono rese visibili le propriet dellelemento,
nellarea Properties.

Operazione associata alla chiusura del frame

Licona associata al frame

Il titolo della finestra

Figura 6 Propriet della finestra

Bocchi Cinzia

10/01/2015

19

Facendo clic sul pulsante racchiuso nellovale rosso della figura 6, si possono visualizzare
le propriet avanzate, mentre cliccando su quello racchiuso nellovale blu si ripristinano le
impostazioni di default.
Proviamo a inserire il titolo della finestra e ad aggiungere unicona (che deve essere
preventivamente caricata nel progetto).
Le modifiche si riflettono nel codice, in particolare nel metodo initialize, che diventa:
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setIconImage(Toolkit.getDefaultToolkit().getImage(MyFrame.cla
ss.getResource("/frame4/duke_icon.jpg")));
frame.setTitle("MyFrame");
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Oltre a modificare le propriet del frame possiamo aggiungere diverse componenti al


pannello del contenuto - getContentPane() - come pulsanti, caselle di testo e cos via.
Basta selezionarli dalla Palette e poi fare clic dove si vuole inserirli, allinterno del frame. I
componenti saranno posizionati secondo il layout impostato. Tutti questi argomenti
saranno trattati nelle successive dispense.

Quest'opera distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0
Internazionale

Bocchi Cinzia

10/01/2015

20