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
Scarica

lez20020506