Laboratorio di IUM - Gianpiero Di Blasi

Transcript

Laboratorio di IUM - Gianpiero Di Blasi
Laboratorio di IUM
Lezione 1
I Frame
Di Blasi Gianpiero - D.M.I. - Università di Catania
Cosa impareremo oggi?
●
I Frame
●
Creazione di un frame
●
La gerarchia dei frame
●
Visualizzazione di informazioni in un frame
Introduzione (1)
●
Quando Java 1.0 fu introdotto conteneva una
libreria chiamata AWT (Abstract Window
Toolkit) per la programmazione delle GUI
–
●
tale libreria gestisce gli elementi di interfaccia
“delegando” il compito al SO sottostante
Con il tempo ci si rese conto che tale approccio
non era ottimale:
–
–
–
leggere differenze di comportamento tra i vari SO
alcuni SO hanno pochissimi elementi di interfaccia
presenza di bug diversi per ogni SO
Introduzione (2)
●
Nel 1996 Netscape ha introdotto una libreria GUI
detta IFC (Internet Foundation Class)
–
–
●
●
tale libreria “dipinge” gli elementi di interfaccia dentro
una finestra vuota
al SO è richiesta solo la costruzione delle finestre e la
possibilità di disegnare su esse
In tal modo i widget di IFC si presentano e
comportano nello stesso modo su qualsiasi SO
SUN ha lavorato con Netscape per perfezionare
la IFC in seguito ribattezzata Swing
Introduzione (3)
●
Swing fa parte di un framework più grande
chiamato JFC (Java Foundation Class) che
comprende anche:
–
–
–
–
●
Java2D
l'API per il Drag'N'Drop
l'API per l'accessibilità
altro ancora
Swing non è un completo sostituto di AWT:
alcune funzionalità delle GUI vengono ancora
gestite tramite AWT (eventi, layout, ecc.)
Swing vs AWT
●
Pro:
–
–
–
–
●
più ricca di elementi, più semplice, più pratica
indipendente dalla piattaforma
risultato coerente su ogni piattaforma
in continuo aggiornamento
Contro:
–
–
leggermente più lenta (poco visibile sui computer
attuali)
le applicazioni Java non risultato “in linea” con le
applicazioni native (problema in parte risolvibile)
I Frame (1)
●
●
●
I Frame sono la “struttura” che sostiene
un'applicazione
Frame significa: cornice, intelaiatura, struttura,
scheletro, sostegno
Un Frame fornisce un rettangolo “decorato” il cui
compito è contenere tutto quello che
l'applicazione deve mostrare all'utente
●
È un oggetto molto complesso
●
Fortunatamente però è molto semplice da usare
I Frame (2)
●
I Frame “regalano” in automatico una serie di
funzionalità base (in funzione del SO sottostante):
–
–
–
–
pulsanti di riduzione a icona, massimizzazione e
chiusura
possibilità di riposizionamento e ridimensionamento
tramite mouse
barra del titolo
icona dell'applicazione
I Frame (3)
Esempio
FirstFrame
Il problema della chiusura del Frame
(1)
●
●
●
L'esempio appena mostrato ha un comportamento
che spesso non è quello desiderato: l'applicazione
non si chiude alla chiusura del Frame
Questo avviene perché in generale la chiusura di
un Frame non implica che l'applicazione debba
chiudersi (si pensi ad applicazioni multi-frame)
È compito del programmatore chiedere
esplicitamente a Java di chiudere l'applicazione al
chiudersi del Frame
Il problema della chiusura del Frame
(2)
●
Esistono due modi per ottenere questo risultato
–
il primo metodo è tramite un semplice comando che
“spiega” al frame cosa deve fare quando si chiude
–
questa operazione viene svolta tramite il metodo:
●
–
void setDefaultCloseOperation(int type)
il secondo metodo è più complesso, ma molto più
flessibile e viene fatto tramite gli “eventi” (di questo
argomento parleremo nelle prossime lezioni)
Il problema della chiusura del Frame
(3)
Esempi
CloseableFrame_a1
CloseableFrame_a2
La gerarchia dei Frame (1)
●
Quali sono i metodi e le variabili già predefinite
in JFrame? Quali debbo aggiungere?
–
–
–
come in tutta la programmazione ad oggetti occorre
conoscere la “gerarchia” entro la quale si colloca il
JFrame
conoscere la gerarchia in una qualsiasi libreria e
sapersi orientare in essa è essenziale per un buon
sviluppatore (in qualunque linguaggio!)
per conoscere la “derivazione” di ogni oggetto Java si
deve fare ricorso alla documentazione
La gerarchia dei Frame (2)
●
●
●
●
Per quanto riguarda le Swing è molto facile
trovarle nella documentazione Java
Infatti si trovano tutte nel package javax.swing
(javax è il prefisso di tutte le librerie che non
sono “core” di Java ma sue estensioni)
Inoltre i nomi delle classi Swing iniziano tutti con
una J maiuscola
La J è stata aggiunta per distinguere tali oggetti
dalle controparti con uguale nome nelle librerie
AWT
La gerarchia dei Frame (3)
●
Cosa vuol dire questa lunga derivazione?
●
JFrame è innanzitutto un Object
●
Esso è poi un java.awt.Component
●
Cosa vuol dire?
La classe java.awt.Component
“A component is an object having a graphical
representation that can be displayed on the screen
and that can interact with the user.
Examples of components are the buttons, checkboxes, and scrollbars of a typical graphical user
interface”
●
Una componente è un oggetto assai generale
●
Essa definisce una lunghissima lista di metodi
●
Ne vedremo qualcuno man mano che ci
interesseranno
La classe java.awt.Container
●
●
È una Component con la proprietà di essere
abilitata a contenere altre Component
In quanto tale essa prevede metodi tipo:
–
–
●
void add(Component c): aggiunge componenti
void remove(Component c): rimuove componenti
Essa prevede inoltre parecchi altri metodi
La classe java.awt.Window
●
●
È un particolare contenitore che può apparire
sullo schermo come entità propria, ma non ha ne
bordi, ne barre, ne controlli
Possiede metodi tipo:
–
–
–
–
void setVisible(boolean b): mostra/nasconde la finestra
(in realtà è ereditato da Component)
void setLocation(int x, int y): posiziona la finestra
void setSize(int w, int h): dimensiona la finestra
void toFront(), void toBack(): aggiusta l'ordine di
comparizione relativamente ad altre finestre
La classe java.awt.Frame
●
●
Si tratta di Window cui sono state aggiunte bordi
e barra del titolo, oltre alle capacità minime di
interfaccia (minimizzazione, riduzione ad icona,
chiusura, possibilità di resizing o meno, ecc.)
Possiede metodi tipo:
–
–
–
void setTitle(String str): imposta un titolo
void setResizable(boolean b): imposta la
“ridimensionabilità” di una finestra
void setIconImage(Icon icon): imposta l'icona della
barra del titolo
La classe javax.swing.JFrame (1)
●
●
●
Si tratta dell'effettivo Frame che utilizzeremo in
tutte le applicazioni a finestra
Esso è un Frame delle AWT a cui le Swing
aggiungono una serie di metodi e servizi
importanti
Inoltre moltissimi dei metodi definiti nel Frame
sono stati ridefiniti per correggere il
malfunzionamento delle AWT
La classe javax.swing.JFrame (2)
●
●
●
Come primo esempio vediamo come centrare un
frame sullo schermo
Primo problema: come si recuperano le
dimensioni dello schermo?
Le applicazioni interagiscono con il SO ed il
device di esecuzione con una classe che
costituisce la “cassetta degli attrezzi” di Java: la
classe java.awt.Toolkit
La classe javax.swing.JFrame (3)
Esempi
CenteredFrame_a1
CenteredFrame_a2
La classe javax.swing.JFrame (4)
●
Secondo esempio: ridurre a icona e massimizzare
●
Per fare ciò i Frame hanno il metodo:
–
●
Esiste un altro metodo:
–
●
void setExtendedState(int state): riduce a icona,
massimizza e visualizza in modalità normale
void setState(int state): analogo, ma non massimizza
La presenza di due metodi ha motivi “storici”:
–
le prime versioni di Java non potevano massimizzare
(le prime GUI Unix non avevano tale funzionalità)
La classe javax.swing.JFrame (5)
Esempio
StateFrame
La struttura di un JFrame (1)
●
Un JFrame contiene una serie di pannelli
secondo una precisa relazione:
–
–
–
–
JRootPane: serve a contenere il “glassPane” e il
“layeredPane”
glassPane: è un pannello invisibile che “copre” tutti gli
elementi del Frame e può catturare per primo tutti le
azioni che il mouse fa sulla finestra
layeredPane serve a contenere il contentPane e
(l'eventuale) menù che si aggiunge al Frame
Il contentPane serve a contenere tutti gli altri elementi
GUI del Frame
La struttura di un JFrame (2)
Arricchire un Frame
●
●
●
●
●
Non possiamo disegnare, scrivere o aggiungere
elementi direttamente al Frame
Gli elementi diversi dal menu devono essere
“aggiunti” al contentPane
Primo obiettivo: scrivere un testo dentro il Frame
Il testo verrà scritto su un “componente” che
verrà “aggiunto” o “attaccato” al contentPane
Tale componente è un JPanel
javax.swing.JPanel
●
È una delle più semplici componenti Swing
●
Serve come area rettangolare sulla quale:
–
–
inserire altri pannelli e componenti Swing
disegnare
La classe javax.swing.JComponent
(1)
“The base class for all Swing components except
top-level containers.
To use a component that inherits from JComponent,
you must place the component in a containment
hierarchy whose root is a top-level Swing container.
Top-level Swing containers (such as JFrame,
JDialog and JApplet) are specialized components
that provide a place for other Swing components to
paint themselves.”
La classe javax.swing.JComponent
(2)
●
●
Tale classe introduce moltissime funzionalità
legate alle Swing
Una delle funzionalità più importanti (ed anche
quella che serve a noi in questo momento)
introdotte da questo tipo di oggetto è la
possibilità di essere “disegnato” con il metodo:
–
void paintComponent(Graphics g): disegna dentro un
JComponent
La classe javax.swing.JComponent
(3)
Esempio
HelloWorld2D
Esercizi (1)
●
●
●
●
Scrivere un'applicazione che crei un frame delle
dimensioni specificate con JOptionPane
Scrivere un'applicazione che faccia “camminare”
un frame per lo schermo
Scrivere un'applicazione che scriva all'interno di
un frame una frase specificata con JOptionPane
Scrivere un'applicazione che crei un frame con i
parametri posizione, dimensione e titolo
specificati con JOptionPane
Esercizi (2)
●
Scrivere un'applicazione con le seguenti
specifiche:
–
–
●
creazione e visualizzazione di 16 frame uguali che
senza sovrapporsi riempiono lo schermo
il titolo dei frame indica quale è la loro posizione
nell'array di frame così creato
Proporre e implementare una soluzione al
problema: come si fa a “spegnere” l'applicazione
solo alla chiusura di tutti i frame?