ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002 1 Corso di Laurea in Informatica Università degli Studi di Salerno 16. Java: Swing Vittorio Scarano Algoritmi e Strutture Dati: Sistemi Distribuiti ASD: Sistemi Distribuiti. Vi.ttorio Scarano 2 Organizzazione della lezione • La programmazione grafica con Swing e AWT • Un primo approccio con Swing: frame e pannelli • Gli eventi dell’ambiente grafico – i listener (rilevatori di evento) – modifica del Look-and-feel – adapter a interfacce • Lo schema di progettazione di Swing • I gestori di layout • Campi di testo
38
Embed
16. Java: Swing - UNISA · 2002. 6. 11. · 16. Java: Swing Vittorio Scarano Algoritmi e Strutture Dati: Sistemi Distribuiti ASD: Sistemi Distribuiti. Vi.ttorio Scarano 2 Organizzazione
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
1
Corso di Laurea in Informatica
Università degli Studi di Salerno
16. Java: Swing
Vittorio Scarano
Algoritmi e Strutture Dati: Sistemi Distribuiti
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
2
Organizzazione della lezione
• La programmazione grafica con Swing e AWT
• Un primo approccio con Swing: frame e pannelli
• Gli eventi dell’ambiente grafico– i listener (rilevatori di evento)
– modifica del Look-and-feel
– adapter a interfacce
• Lo schema di progettazione di Swing
• I gestori di layout
• Campi di testo
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
2
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
3
Programmazione grafica
• Una necessità:– interfaccia intuitiva e gradevole
– tutti gli applicativi oggigiorno sono grafici
• In Java 1.0 viene introdotto Abstract Windows Toolkit (AWT)
• Principi di AWT:– indipendenza dalla reale rappresentazione grafica attraverso
i “ peer” • componenti dipendenti dall’ambiente che gestivano il vero
input/output grafico
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
4
Alcuni problemi di AWT
• Il minimo comune denominatore”– per piattaforme come X/Motif, Macintosh, Windows
• Alcuni bug su varie piattaforme
• Il passo successivo– Netscape progetta la Internet Foundation Classes
– che rappresentano finestre in maniera uguale su tutte le piattaforme
• La Sun decide di partire da IFC per presentare Swing– che fa parte delle Java Foundation Classes
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
3
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
5
Caratteristiche di Swing
• Ricca dotazione di interfacce
• Piattaforma più robusta e testata
• Minore dipendenza dalla piattaforma di base
• Risultato coerente su tutte le piattaforme– ma possibile programmare l’aspetto (es. alla Windows)
• Alcuni (piccoli) problemi:– essendo soluzioni implementate senza i peersaranno più
lenti del corrispondente in AWT
• Di AWT si usano comunque alcune componenti:– gestione eventi, etc.
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
6
Swing e AWT
Swing+
AWTAWT
• Di AWT si usano comunque alcune componenti:– gestione eventi, etc.
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
4
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
7
Organizzazione della lezione
• La programmazione grafica con Swing e AWT
• Un primo approccio con Swing: frame e pannelli
• Gli eventi dell’ambiente grafico– i listener (rilevatori di evento)
– modifica del Look-and-feel
– adapter a interfacce
• Lo schema di progettazione di Swing
• I gestori di layout
• Campi di testo
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
8
Un primo passo: creazione di un frame
• Una finestra di massimo livello cioè direttamente visualizzata dal Sistema Operativo è detta frame
• La classe di AWT si chiama Frame, quella di Swing si chiama JFrame (notare la doppia maiuscola)
• Fondamentale la ereditarietà:– tutti i nostri componenti grafici devono ereditare da una
complessa (ma non necessariamente conosciuta) gerarchia
• I frame sono contenitori:– possono contenere altre componenti grafiche
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
5
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
9
La classe SimpleFrame
import javax.swing.*;
public class SimpleFrame extends JFrame {public SimpleFrame () {
setSize (WIDTH,HEIGHT);}
public static final int WIDTH = 300;public static final int HEIGHT= 200;
}
• Import – per la extends
• Sottoclasse di JFrame • Costruttore
– uso del metodo della classe JFrame per settare la dimensione
• Variabili di istanza– solo costanti utilizzate
SimpleFrame.java
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
10
La classe SimpleFrameTest
import javax.swing.*;
public class SimpleFrameTest {public static void main (String[] args) {
SimpleFrame f = new SimpleFrame();f.setDefaultCloseOperation (
JFrame.EXIT_ON_CLOSE);f.show();
}}
• Semplice programma di test
• Crea un frame• Setta alcune
caratteristiche– termina il programma
quando il frame viene chiuso
• Mostra il frame
SimpleFrameTest.java
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
6
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
11
Alcune caratteristiche di un frame
• Tra le tante caratteristiche ereditate da JFrame – la posizione
– il titolo
– la icona (in alto a sinistra a sulla barra)
• Nel prossimo esempio:– vogliamo creare un frame al centro dello schermo
• abbiamo bisogno di Toolkit per prelevare la dimensione corrente dello schermo
– scegliendo il titolo e la icona
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
12
La classe CenteredFrame
import java.awt.*;import java.awt.event.*;import javax.swing.*;public class CenteredFrame extends JFrame {
public CenteredFrame () {Toolkit kit = Toolkit.getDefaultToolkit();Dimension screenSize=
ButtonPanel panel = new ButtonPanel();Container contentPane = getContentPane();contentPane.add(panel);
}
} // fine della classe ButtonFrame// … continua con le classi ButtonPanel // … e ColorAction
• Import • Costruttore:
– set del titolo – set della dimensione
• Creazione di un ButtonPanel …
• … e aggiunta del ButtonPanel al Frame
ButtonFrame.java
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
17
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
33
La classe ButtonFrame (2)
//… continuaclass ButtonPanel extends JPanel {
public ButtonPanel() {JButton yButton = new JButton(“Giallo");JButton bButton = new JButton("Blu");JButton rButton = new JButton("Rosso");add(yButton); add(bButton);add(rButton);ColorAction yAction = new ColorAction(
Color.yellow,this);ColorAction bAction = new ColorAction(
Color.blue, this);ColorAction rAction = new ColorAction(
void makeButton(String name, String plafName) {JButton button = new JButton(name);add(button);LookAction l = new LookAction(this, plafName);button.addActionListener(l);}
}// fine della classe PlafPanel .. continua …
• Usa un metodo per creare un bottone e registrare un listener
• Argomenti– label bottone– stringa della classe da usare
per cambiare look
• makeButton()– crea bottone e aggiunge al
pannello– crea listener e lo aggiunge
PlafFrame.java
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
40
La classe PlafFrame (3)
class LookAction implements ActionListener {
public LookAction(JPanel p, String s) {pann = p;look = s;
ButtonPanel panel = new ButtonPanel();Container contentPane = getContentPane();contentPane.add(panel);
}
} // fine della classe ButtonFrame// … continua con le classi ButtonPanel// … e ColorAction
• Import • Costruttore:
– set del titolo – set della dimensione
• Creazione di unButtonPanel …
• … e aggiunta delButtonPanel al Frame
ButtonFrameBorder.java
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
28
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
55
La classe ButtonFrame (2) con il FlowLayout
//… continuaclass ButtonPanel extends JPanel {
public ButtonPanel() {setLayout (new
FlowLayout(FlowLayout.RIGHT));JButton yButton = new JButton(“Giallo");JButton bButton = new JButton("Blu");JButton rButton = new JButton("Rosso");add(yButton);add(bButton);add(rButton);ColorAction yAction = new ColorAction(
Color.yellow,this);ColorAction bAction = new ColorAction(
Color.blue, this);ColorAction rAction = new ColorAction(
Color.red, this);……
• Seleziona come gestore del Layout un oggetto FlowLayout– che viene creato
passando una costante definita nella classe
– che posizione a destra i pulsanti
– altra scelta LEFT e CENTER
ButtonFrameBorder.java
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
56
Un altro Layout Manager : BorderLayout
• Permette di definire con più precisione la posizione
• Divide la finestra in:
• Ridimensiona i componenti in modo che riempiano tutto lo spazio disponibile– di default su JFrame (inserimento al centro)
North
West Center East
South
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
29
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
57
Cosa accade se usiamo BorderLayout()?
• Si usa BorderLayout()
• Posizioniamo:– il Giallo a nord
– il blu a est
– il rosso a sud
• Cosa accade?
//… continuaclass ButtonPanel extends JPanel {
public ButtonPanel() {setLayout (new BorderLayout());JButton yButton = new JButton(“Giallo");JButton bButton = new JButton("Blu");JButton rButton = new JButton("Rosso");add(yButton, BorderLayout.NORTH); add(bButton, BorderLayout.EAST);add(rButton, BorderLayout.SOUTH);
……
ButtonFrameBorder.java
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
58
E se mettiamo tutti e tre i pulsanti a Sud?
• Si usa BorderLayout()
• Posizioniamo:– tutti i pulsanti a sud
• Cosa accade?
//… continuaclass ButtonPanel extends JPanel {
public ButtonPanel() {setLayout (new BorderLayout());JButton yButton = new JButton(“Giallo");JButton bButton = new JButton("Blu");JButton rButton = new JButton("Rosso");add(yButton, BorderLayout.SOUTH); add(bButton, BorderLayout.SOUTH);add(rButton, BorderLayout.SOUTH);
……
• Solo un componente può essere inserito a sud:
• l’ultimo sostituisce il precedente
• Come si fa?
ButtonFrameBorder.java
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
30
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
59
La soluzione: un Panel che contiene i pulsanti
//… continuaclass ButtonPanel extends JPanel{
public ButtonPanel(){
setLayout (new BorderLayout());JButton yellowButton = new JButton("Giallo");JButton blueButton = new JButton("Blu");JButton redButton = new JButton("Rosso");
JPanel cont = new JPanel();cont.add(yellowButton);cont.add(blueButton);cont.add(redButton);
add(cont, BorderLayout.SOUTH);….
• Seleziona come gestore del Layout un oggetto BorderLayout
• Crea 3 bottoni• Crea un Pannello
– al quale aggiunge i tre pulsanti
– con il gestore di layout standard (BorderLayout)
• Poi aggiunge il pannello a sud
ButtonFrameBorder.java
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
60
Organizzazione della lezione
• La programmazione grafica con Swing e AWT
• Un primo approccio con Swing: frame e pannelli
• Gli eventi dell’ambiente grafico– i listener (rilevatori di evento)
– modifica del Look-and-feel
– adapter a interfacce
• Lo schema di progettazione di Swing
• I gestori di layout
• Campi di testo
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
31
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
61
Componenti per input di testo
• Due componenti:– JTextField per l’input di un rigo di testo
– JTextArea per l’input di una area di testo (più righi)
• Entrambe derivano dalla classe astratta JTextComponent
– che contiene la maggior parte dei metodi tra cui:• void setText (String t)
– modifica il testo della componente
• String getText()– restituisce il testo della componente
• void setEditable (boolean b)– può essere modificata oppure no
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
62
Listener per campi di testo
• Implementa la interfaccia DocumentListener con i metodi:– void insertUpdate (DocumentEvent e) { }– void removeUpdate (DocumentEvent e) { }– void changedUpdate (DocumentEvent e) { }
• Sfortunamente nessuna classe adapter è disponibile:– si devono esplicitamente implementare i 3 metodi anche se
servono vuoti
• Per aggiungere un listener ad un campo si usa:JTextField nome = new JTextField(30);TextListener lis = new TextListener();nome.getDocument().addDocumentListener(lis);
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
32
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
63
Un esempio di uso
• Una finestra che contenga due campi di testo:– in uno scriviamo il nome– nell’altro (non editabile) compare “Ciao…”
• Necessario (a parte la classe TextTest)– una classe TextFrame che
• crea due oggetti JTextField
• setta il listener di uno dei due (quello di input) a TextListener a cui passa le reference dei due campi
• setta l’altro JTextField a non editabile
– una classe TextListener• nel costruttore prende due variabili di reference JTextField
• quando il testo sul primo campo cambia, scrive la stringa sul secondo
AS
D: S
iste
mi D
istr
ibui
ti.
Vi.t
tori
o S
cara
no
64
La classe TextTest
import java.awt.*;import javax.swing.*;
public class TextTest{
public static void main(String[] args){
TextFrame frame = new TextFrame();frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);frame.show();
}}
• Import – per usare JFrame
• Metodo main– crea un frame
TextFrame– ne setta alcune
caratteristiche• termina il programma
quando il frame viene chiuso
– mostra il frame
TextTest.java
ASD: Sistemi Distribuiti (Prof. Scarano) 11/06/2002
public TextFrame() {setTitle("Test sul Testo");setSize(300, 200);Container contentPane = getContentPane();JPanel pan = new JPanel ();JTextField nome = new JTextField(30);JTextField saluto = new JTextField(40);saluto.setEditable (false);TextListener lis = new TextListener(
public CalculatorFrame() {setTitle("Euroconvertitore");setSize(100, 100);
Container contentPane = getContentPane();JPanel pan = new JPanel ();JTextField v = new JTextField(10);JTextField r=new JTextField(10);r.setEditable (false);TextListener lis = new TextListener(v,r);v.getDocument().addDocumentListener(lis);