gestione eventi
classi interne, frame e pannelli
istanza classe interna
classi interne
definite internamente a
un’altra classe
ne sono membri
ogni istanza di una classe
interna esiste all’interno di
un’istanza della classe
esterna e ha pieno accesso
ai membri di questa
6 maggio 2002
IGEA 2001/02
istanza classe esterna
2
repaint()
il metodo paint di un’applet non dovrebbe mai
essere esplicitamente chiamato
è responsabilità della JVM
si può chiedere alla JVM di provvedere al ridisegno
tramite l’invocazione repaint()
no parametri attuali (paint avrebbe richiesto un
parametro Graphics)
la JVM provvede al ridisegno non appena possibile
non chiamare repaint() dal metodo paint
errore concettuale
6 maggio 2002
IGEA 2001/02
3
applet che sposta l’uovo
public class EggApplet extends Applet {
public EggApplet() {
egg = new Ellipse2D.Double(0, 0, W, H);
MouseClickListener listener = new
MouseClickListener();
addMouseListener(listener);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.draw(egg);
}
private Ellipse2D.Double egg;
private static final double W = 30, H = 50;
// continua prossima slide
6 maggio 2002
IGEA 2001/02
4
applet che sposta l’uovo/2
// definizione della classe interna
private class MouseClickListener extends MouseAdapter
{
public void mouseClicked(MouseEvent event) {
int mouseX = event.getX();
int mouseY = event.getY();
// sposta l'ellisse su (mouseX, mouseY)
egg.setFrame(mouseX - W / 2,
mouseY - H / 2, W, H);
repaint(); // ridisegna, appena possibile
}
} // fine classe interna MouseClickListener
v. applet EggDrag
} // fine classe esterna EggApplet
che trascina l’uovo
6 maggio 2002
IGEA 2001/02
5
applicazioni grafiche
sfruttano il package java.awt
a partire da jdk 1.2 il package
estensione javax.swing è stato
integrato nella distribuzione standard
attualmente le applicazione grafiche
“più standard” sono quelle costruite
tramite javax.swing
le uniche realmente multipiattaforma
6 maggio 2002
IGEA 2001/02
6
frame
finestra con
bordatura e barra
del titolo
import javax.swing.JFrame;
class EggFrame extends JFrame {
public EggFrame() {
setSize(200, 200);
}
}
public class FrameTest {
public static void main
(String args[]) {
EggFrame f = new EggFrame();
f.setTitle("EggFrame");
f.show();
}
}
6 maggio 2002
IGEA 2001/02
7
thread
singolo flusso sequenziale di controllo
all’interno di un programma in esecuzione
argomento avanzato
v. tutorial
C:\jdk1.3.1_02\tutorial\essential\threads
\definition.html
percorso essential\threads\definition.html
relativo alla cartella base del tutorial
6 maggio 2002
IGEA 2001/02
8
nozioni base sui frame
all’avvio del main si attiva il main thread
la visualizzazione del frame è l’inizio di un
secondo thread (dell’interfaccia grafica)
deve essere chiuso esplicitamente con
System.exit(.)
System.exit(.) termina la JVM corrente
non conviene chiamare System.exit(.) nel
main poiché il programma terminerebbe
immediatamente
6 maggio 2002
IGEA 2001/02
9
chiusura di un frame
si realizza chiamando System.exit(.)
in seguito al click utente sull’icona di
chiusura finestra
occorre intercettare gli “eventi
finestra” (WindowEvent)
6 maggio 2002
IGEA 2001/02
10
eventi finestra
classe WindowEvent
interface WindowListener
windowOpened(WindowEvent e)
windowClosed(WindowEvent e)
windowActivated(WindowEvent e)
windowDeactivated(WindowEvent e)
windowIconified(WindowEvent e)
windowDeiconified(WindowEvent e)
windowClosing(WindowEvent e)
adapter WindowAdapter
6 maggio 2002
IGEA 2001/02
11
chiusura di un frame/2
class EmptyFrame extends JFrame {
public EmptyFrame() {
setSize(200, 200);
WindowCloser listener = new WindowCloser();
addWindowListener(listener);
}
private class WindowCloser extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
}
}
6 maggio 2002
IGEA 2001/02
12
nozioni base sui frame/2
la superficie di un
frame Swing è
ricoperta da quattro
lastre
radice (rootPane)
vetro (glassPane)
contenuti
(contentPane)
stratificata
(layeredPane)
6 maggio 2002
IGEA 2001/02
13
contenimento fra lastre
cattura eventi
del mouse
rootPane
layeredPane
glassPane
contentPane
contiene
pannelli a
discrezione
utente
6 maggio 2002
contiene la
barra dei menu
(se presente)
IGEA 2001/02
menuBar
(opzionale)
14
pannelli
consentono di disegnare
classe JPanel di Swing
si addizionano alla lastra dei contenuti
(contentPane)
la lastra dei contenuti può
contenere pannelli disposti
secondo schemi predefiniti
es. “a zone”, con cinque zone
denominate “North”, “South”,
“West”, “East” e “Center”
6 maggio 2002
IGEA 2001/02
15
disegno in un pannello
situazione simile a quelle delle applet
metodo paintComponent(Graphics
g) invece di paint(Graphics g)
la prima istruzione di paintComponent
deve essere
super.paintComponent(g)
per disegnare sfondo, bordi, decorazioni ed
impostare gli attributi dell’oggetto Graphics
6 maggio 2002
IGEA 2001/02
16
inserimento pannelli nella
lastra dei contenuti
metodo add(JPanel mioPannello)
applicato all’oggetto contentPane
l’oggetto contentPane si ottiene con il
metodo getContentPane() applicato
all’oggetto JFrame
mioJFrame.getContentPane().ad
d(mioPannello)
6 maggio 2002
IGEA 2001/02
17
esempio
applicazione grafica (JFrame) per il
trascinamento di un uovo
classe EggFrame
6 maggio 2002
IGEA 2001/02
18
componenti
public abstract class Component
extends Object
oggetti che
hanno una rappresentazione grafica
possono essere mostrati sullo schermo
possono interagire con l’utente
pannelli e lastra dei contenuti sono (IS-A)
Component
altri es.: pulsanti, campi di testo, checkbox,
barre di scorrimento ecc.
6 maggio 2002
IGEA 2001/02
19
contenitori
public class Container extends
Component
componenti speciali concepiti per essere
“contenitori di componenti”
la lastra dei contenuti è un contenitore
metodo add(.) per addizionare un componente
ogni contenitore ha il proprio “gestore del
layout” (o “layout manager”)
il layout manager stabilisce come debbono
essere disposti i componenti
un JPanel IS-A Container
6 maggio 2002
IGEA 2001/02
20
layout manager
il layout manager di un contenitore dispone
normalmente i componenti “a scorrimento”
orizzontalmente e sequenzialmente, andando a
capo solo quando lo spazio orizzontale
è esaurito
il layout manager di una lastra dei
contenuti dispone i componenti
“a zona”
ad ogni contenitore si può associare
un nuovo layout manager tramite il
metodo setLayout(.)
6 maggio 2002
IGEA 2001/02
21
layout manager/2
setLayout(new FlowLayout())
a scorrimento
ciascun componente avrà la sua “ampiezza naturale”
setLayout(new BorderLayout())
a zona
componenti con ampiezze tali da riempire il
contenitore
setLayout(new GridLayout(m, n))
a griglia m × n
celle di dimensione costante
6 maggio 2002
IGEA 2001/02
22
campi di testo
public class JTextField extends
JTextComponent
IS-A Component
oggetti JTextField realizzano campi di
testo
consentono l’input/output di stringhe tramite i
metodi getText() e setText(.)
l’evento più interessante da controllare su
un JTextField è la pressione del tasto
“invio” (è un ActionEvent)
6 maggio 2002
IGEA 2001/02
23
eventi azione
classe ActionEvent
interface ActionListener
actionPerformed(ActionEvent e)
azioni utente che innescano un
ActionEvent
pressione di invio in un JTextField
click su pulsante
6 maggio 2002
IGEA 2001/02
24
esempio/2
applicazione grafica (JFrame) per il
trascinamento di un uovo,
visualizzazione delle sue cordinate e
impostazione coordinate da parte
dell’utente
classe EggFrame2
6 maggio 2002
IGEA 2001/02
25