Basi Basi di di dati dati ee sistemi sistemi informativi informativi II mod.laboratorio mod.laboratorio
Alessandro De Luca Università degli Studi di Napoli Federico II
Lezione, 13 maggio 2015
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Introduzione a Java Swing ●
Usata per creare GUI
●
Include un gran numero di componenti
●
● ●
Permette di includere funzionalità grafiche Parte delle Java Foundation Classes Indipendente dalla piattaforma, look&feel personalizzabile
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
2 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Contenitore: JFrame North
Layout: BorderLayout Center
Componenti:
JLabel
JButton, contenente una ImageIcon
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
3 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Per costruire una GUI ● ●
●
●
Importare i package Creare un contenitore toplevel (es. JFrame) Applicare un layout (es. BorderLayout) Aggiungere componenti (es. JButton, JLabel)
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
4 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Componenti Swing ●
Contenitori top-level
●
Contenitori general-purpose
●
Contenitori special-purpose
●
Controlli di base
●
Display non interattivi
●
Display interattivi
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
5 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Contenitori top-level ●
Componenti al livello superiore di ogni gerarchia di componenti
JDialog
JFrame JApplet
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
6 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Importanza ●
●
●
Ogni programma ha almeno un contenitore top-level Di norma un'applicazione GUI ha almeno un frame al top della gerarchia. Es. applicazione con una finestra principale e due di dialogo
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
7 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Contenitori general-purpose ●
Contenitori intermedi che possono essere usati in varie circostanze
●
Usati per raggruppare controlli di base
●
Aggiunti ai contenitori top-level
Scroll pane
A. De Luca (Univ. Federico II)
Toolbar
Basi di dati e sist. inf. I, laboratorio
Panel
13 maggio 2015
8 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Controlli di base ●
Sono la parte attiva della GUI
●
I controlli sono la sorgente degli eventi
●
Gli oggetti sono legati ai controlli per gestire gli eventi
Buttons
A. De Luca (Univ. Federico II)
Slider
Basi di dati e sist. inf. I, laboratorio
Menu
13 maggio 2015
9 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Display non interattivi Non modificabili dall'utente
Tooltip
A. De Luca (Univ. Federico II)
Label
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
10 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Display interattivi ●
Forniscono interfacce standard per task comuni (es. Inserire testo: TextField)
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
11 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Come si lega tutto insieme ●
Esistono 5 diversi layout manager –
BorderLayout
–
BoxLayout
–
FlowLayout
–
GridBagLayout
–
GridLayout
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
12 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Esempio di componente: JButton Alcuni costruttori: JButton()
Crea un pulsante senza testo né icone
JButton(String text)
Crea un pulsante con testo
JButton(String text, Icon icon)
Crea un pulsante con testo e icona
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
13 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
JButton (cont.) Alcuni metodi: addActionListener Registra un (ActionListener a) ActionListener al JButton setFont(Font font)
Specifica i font
setBackground (Color color)
Specifica il colore di sfondo
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
14 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Esempio: Hello world ●
●
Importa i package import javax.swing.*; Spesso i programmi swing importano anche import java.awt.*; (AWT è un'altra JFC, meno recente)
●
E per gestire gli eventi import java.awt.event.*;
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
15 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Alcune istruzioni ●
Sceglie la decorazione della finestra JFrame.setDefaultLookAndFeelDecorated (true)
●
Crea il frame e lo mostra su schermo JFrame frame = new JFrame("HelloWorldSwing"); //... frame.pack(); frame.setVisible(true);
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
16 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Alcune istruzioni (cont.) ●
Inserisce il label nel frame (scritta «Hello world») JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label);
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
17 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Content Pane ● ●
La label è aggiunta al content pane Ogni Contenitore top-level ha un content pane
●
Contiene tutte le componenti visibili
●
Non contiene menu e decorazioni
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
18 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Altre istruzioni ●
Per uscire cliccare sulla X della finestra frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
●
Parte finale: fare partire il thread javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { /* create and show the GUI */ } });
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
19 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Codice (1/2) import javax.swing.*; public class HelloWorldSwing { private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new Jframe("Hello World: Swing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); }
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
20 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Codice (2/2)
}
public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { createAndShowGUI(); } } ); }
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
21 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Thread ●
Tre tipi di thread –
Iniziale
–
Event dispatch thread
–
Worker (o backgorund) thread
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
22 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Initial thread ●
●
●
●
Il thread che fa partire l'applicazione iniziale Crea un oggetto Runnable che inizializza la GUI Passa l'oggetto all'event dispatch thread Creata la GUI l'applicazione è event driven
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
23 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Per iniziare ●
Due metodi per creare la GUI –
SwingUtilities.invokeLater (schedula il task ed esce)
–
SwingUtilities.invokeAndWait (schedula il task ed attende la fine)
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
24 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Event dispatch thread ●
●
●
Il codice che gestisce gli eventi gira su questo thread Anche molti metodi Swing girano su questo thread Necessario perché –
Questi metodi non sono «thread safe»
–
invocati su thread multipli possono creare ●
Errori di coerenza della memoria
●
Interferenza tra thread
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
25 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Worker threads ● ●
Usati per task lunghi Es. Caricare dei file per un'animazione
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
26 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Altro programma di esempio ●
Aggiornare un'etichetta ogni volta che l'utente schiaccia il pulsante
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
27 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Istruzioni, 1 ●
Creare il JButton
JButton button = new JButton("I'm a" + " Swing button!"); ●
Creare uno shortcut da tastiera button.setMnemonic('i');
●
Dichiarare variabili per la JLabel private static String labelPrefix = "Numero di clic: "; private int numClicks = 0;
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
28 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Istruzioni, 2 ●
Istanziare la label JLabel label = new JLabel(labelPrefix + '0');
●
Aggiornare la label label.setText(labelPrefix + numClicks);
●
Pulsante ed etichetta vanno inseriti in un contenitore
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
29 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Istruzioni, 3 ●
Creare il contenitore (JPanel) e assegnargli un layout JPanel panel = new JPanel(new GridLayout(0,1));
●
Aggiungere le componenti panel.add(button); panel.add(label);
●
Assegnare un bordo
panel.setBorder( BorderFactory.createEmptyBorder(... )); A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
30 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Eventi ●
●
Eventi avvengono quando si –
Preme un tasto
–
Muove/clicca il mouse
–
ecc…
Per ricevere la notifica un oggetto deve registrarsi ad un event listener
●
Bisogna implementare un'interfaccia
●
Ci sono delle linee di codice necessarie
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
31 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Definire i listener ●
Specificare che la classe di gestione degli eventi implementa un listener public class MyClass implements ActionListener
●
Registrare un o piú componenti dell'oggetto al listener someComponent.addActionListener (istanzaMyClass);
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
32 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Definire i listener (cont.) ●
Implementare l'interfaccia al listener public void actionPerformed(ActionEvent e) { }
//reazione all'evento...
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
33 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Applicazione al nostro esempio public class SwingApplication implements ActionListener { //... JButton button = new JButton("I'm a Swing button!"); button.addActionListener(this); //... public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
34 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Tipi di eventi e di listener ●
Esistono vari listener –
ActionListener (click su un pulsante, ...)
–
WindowListener (chiudere una finestra)
–
MouseListener (pressione pulsante mouse)
–
PropertyChangeListener (cambiamento in una componente, es. Testo in una label)
–
…
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
35 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Codice (1/4) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingApplication implements ActionListener { private static String labelPrefix = "Numero di clic: "; private int numClicks = 0; final JLabel label = new JLabel(labelPrefix + "0
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
");
36 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Codice (2/4) public Component createComponents() { JButton button = new JButton("I'm a Swing button!"); button.setMnemonic(KeyEvent.VK_I); button.addActionListener(this); label.setLabelFor(button); JPanel pane = new JPanel(new GridLayout(0, 1)); pane.add(button); pane.add(label); pane.setBorder(BorderFactory.createEmptyBorder(30, 30,10,30)); //top,left,bottom,right return pane; } A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
37 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Codice (3/4) /** * Crea e mostra la GUI. Invocare dall'event-dispatching thread. */ private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); //imposta L&F JFrame frame = new Jframe("SwingApplication"); //Crea finestra frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SwingApplication app = new SwingApplication(); Component contents = app.createComponents(); frame.getContentPane().add(contents, BorderLayout.CENTER); frame.pack(); frame.setVisible(true);
//Mostra la finestra.
} A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
38 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Codice (4/4) // Evento click sul pulsante public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } public static void main(String[] args) { //Job schedule per l'event-dispatching thread: GUI javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
39 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Design Swing tramite NetBeans ●
●
●
Permette di risparmiarsi molte righe di codice e di concentrarsi quasi esclusivamente sulla gestione degli eventi. Si inizia aggiungendo un contenitore top-level al progetto, ad es…
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
40 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Nuovo JFrame
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
41 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Disegno della GUI ●
●
●
Una volta creato il contenitore, la scheda Design permette di aggiungere controlli trascinandoli dalla Palette La scheda Navigator mostra la gerarchia delle componenti, consentendo di rinominarle La scheda Properties mostra i campi del controllo selezionato e permette di modificarli ove possibile. Molti hanno metodi get e set
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
42 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Aggiunta di listener ●
●
●
È possibile registrare listener ai controlli, ad es. dal menu contestuale NetBeans poi mostra il nuovo metodo in cui va scritta la reazione all'evento Per esempio, per gestire i clic su un pulsante…
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
43 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
ActionListener
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
44 / 45
Lezione: Swing
Soluzione esercizi 7 e 12 maggio
Soluzione esercizi
Vedere file TestPiloti.zip.
A. De Luca (Univ. Federico II)
Basi di dati e sist. inf. I, laboratorio
13 maggio 2015
45 / 45