INTERFACCE GRAFICHE IN JAVA - II
[Per corso su Java vedere
http://java.sun.com/docs/books/tutorial/]
Contenitori in Java
Contenitori Top-level
Realizzati come finestre top-level nell'ambiente in cui sara'
eseguito il programma Java.
- Frame / JFrame: finestra primaria di un'applicazione
- Dialog / JDialog: finestra secondaria di dialogo
frame: | dialogo: |
|
|
Contenitori intermedi
Contenitori di uso generale:
- Panel / JPanel: pannello a scomparto unico
- ScrollPane / JScrollPane: pannello a scomparto unico
con barre di scorrimento orizzontali e/o verticali
- JSplitPane: pannello bipartito in orizzontale
o in verticale
- JTabbedPane: pannello a schedario
- JToolBar: barra orizzontale o verticale contenente componenti
(in genere bottoni con etichette grafiche) che puo' essere trascinata
e posizionata a piacere
scrolled pane: | split pane: |
tabbed pane: |
|
|
|
Contenitori per usi speciali:
- Menubar / JMenuBar: barra di menu' associata ad un frame,
puo' contenere componenti di classe Menu / JMenu
(ved. piu' avanti)
- JInternalFrame: sotto-finestra applicativa (finestra di
documento), compare all'interno della finestra principale
- JDesktopPane: pannello che simula una desktop
all'interno di una finestra, usato per contenere
degli internal frames
- JLayeredPane:
pannelli a livelli (vi posso collocare oggetti assegnando ad
ogni oggetto una profondita', e gli oggetti sono disegnati
sovrapposti fra loro in base alla profondita'
internal frames su desktop: |
|
Dispositivi in Java
Dispositivi di controllo
In grado di ricevere input e mostrare informazioni di stato.
Vari tipi di bottoni
- Button / JButton: bottone di comando
- Checkbox / JCheckBox: bottone a due stati
- Gruppo di bottoni radio (bottoni a due stati che lavorano in modo
mutuamente esclusivo), realizzati in modo diverso in AWT e Swing:
- in Swing classe JRadioButton
- in AWT si usa classe Checkbox
bottoni varii: |
|
Vari tipi di menu' e di voci di menu'
Le classi di voci di menu' rispecchiano le classi di bottoni:
- MenuItem, CheckBoxMenuItem, in AWT,
- JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem in Swing
Classi per i menu':
- Menu / JMenu: menu' semplice, creo le voci a parte
e le aggiungo al menu' per popolare la tendina.
Puo' essere usato come voce di un altro menu',
realizzando in tal modo menu' a cascata.
Puo' essere aggiunto ad una Menubar / JMenuBar.
- PopupMenu / JPopupMenu: menu' contestuale a scomparsa
(pop-up).
Menu' con voci di vari tipi (Swing): |
|
Altri dispositivi
- List / JList: liste di alternative da cui posso selezionarne una
- JSlider: potenziometro scorrevole
- TextField / JTextField: campo di input testuale a linea
singola
- JPasswordField: campo di input testuale che non mostra
la stringa inserita
Dispositivi per mostrare informazioni
Non sensibili a input:
- Label, JLabel: etichetta testuale in AWT,
testuale e/o grafica in Swing
- JProgressBar: mostra avanzamento nell'esecuzione di
un'operazione
- JToolTip: messaggi di aiuto in sovra-impressione
progression bar: |
|
Dispositivi per mostrare / acquisire informazioni formattate
Mostrano informazioni complesse, possono essere anche editabili:
- TextArea / JTextArea: area di testo su piu' linee
- JTable: tabella organizzata a righe e colonne
- JTree: informazioni organizzate ad albero,
es: per navigare nel file system
Dispositivi con funzioni speciali
Per scegliere un file nel file system:
- In AWT ho una speciale finestra di dialogo: FileDialog
- In Swing ho componente JFileChooser che puo' essere
collocata in qualsiasi contenitore
Per scegliere un colore: JColorChooser
Layout Management
Processo di stabilire automaticamente dimensioni e posizione delle
componenti all'interno di un contenitore.
Ogni contenitore ha un layout manager.
Potrei lavorare senza layout manager, ma allora dovrei fornire
posizione assoluta di ogni componente all'interno del contenitore,
ed avrei problemi quando il contenitore top-level viene redimensionato.
Classi di layout managers
Gestione degli eventi in Java
- Classi per gli eventi
- Classi event listener, che definiscono
modi di reagire a eventi di una certa classe
Parte di AWT, usate anche in Swing.
Classi di eventi
Gli eventi sono classificati a seconda
della loro causa scatenante, che puo' essere:
-
un'azione fisica: cliccare mouse, muovere mouse,
premere tasto su tastiera...
-
un'azione "logica", la cui corrispondenza con azione fisica dipende
dal sistema su cui il programma Java sara' eseguito:
es. evento "selezione" su un sistema puo' coincidere con doppio click
del tasto sinistro del mouse, su un altro sistema puo' essere effettuata
in modo diverso
Classi di eventi hanno nomi del tipo XXXEvent dove
XXX e' la causa.
Es: MouseEvent...
Ogni classe di componente e' una potenziale sorgente di certe classi di
eventi.
Es: un bottone puo' originare eventi di classe "azionamento"
(classe ActionEvent).
Event listeners
Posso registrare un event listener per ricevere eventi di una
certa classe da una certa componente dell'interfaccia.
Vi e' un event listener per ogni classe di evento: se la classe evento e'
XXXEvent, la classe listener e' XXXEventListener.
La classe listener prevede uno o piu' metodi che scattano quando
il listener riceve un evento di quella classe.
In realta'
un listener non e' una classe, ma un'interfaccia (come una classe, ma
l'implenentazione dei metodi non e' definita).
Stabilita la classe di eventi che voglio catturare, devo creare
una sottoclasse del listener corrispondente,
fornendo il codice dei suoi metodi
(essendo i listener interfacce e non classi, non si dice "sottoclasse"
bensi' "implementazione").
Poi associo il listener alla componente sulla quale voglio catturare gli
eventi.
Esempio: voglio catturare azionamento di un bottone.
- La classe di evento e' ActionEvent
- Creo sottoclasse di ActionListener che definisce
implementazione del metodo ActionPerformed
con le operazioni che intendo far fare al bottone quando azionato
- Creo il bottone (istanza della classe JButton),
creo un action listener (istanza della sottoclasse di
ActionListener da me definita),
associo questo action listener al bottone
Quando l'utente azionera' il bottone, scattera' l'action listener
che eseguira' le operazioni.
Questo paradigma si chiama delegation perche' il bottone
delega l'azione da eseguire ad un altro oggetto (il listener).
Posso associare lo stesso event listener a piu' componenti
nell'interfaccia: questi reagiranno allo stesso evento nello
stesso modo.
Posso associare piu' event listener allo stesso oggetto: questo
avra' piu' reazioni.
Il fatto che i listeners siano interfacce e non classi (cioe' che non
implementino i metodi) implica che per i listener che hanno piu' metodi
devo fornire un'implementazione di tutti i metodi, inclusi quelli
che non mi interessano (l'implementazione di questi non fara'
nulla: {}).
Per comodita' sono forniti adapters che forniscono implementazione
standard di un listener (dove tutti i metodi non fanno nulla): creo
sottoclasse dell'adapter ridefinendo solo i metodi che mi interessano.
Esempio:
La classe WindowEvent corrisponde a eventi sulle finestre
top-level: apertura / chiusura, iconificazione / deiconificazione...
La classe WindowListener ha un metodo per ciascuno
degli eventi di cui sopra.
Se voglio reagire solo all'evento di chiusura:
- o uso WindowListener e scrivo codice per tutti i metodi
(quelli che non interessano non faranno nulla)
- oppure uso WindowAdapter e scrivo codice solo per
il metodo che mi interessa