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,
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 2 / 45
Contenitore: JFrame North Layout: BorderLayout Center Componenti: JLabel JButton, contenente una ImageIcon 3 / 45
Per costruire una GUI Importare i package Creare un contenitore toplevel (es. JFrame) Applicare un layout (es. BorderLayout) Aggiungere componenti (es. JButton, JLabel) 4 / 45
Componenti Swing Contenitori top-level Contenitori general-purpose Contenitori special-purpose Controlli di base Display non interattivi Display interattivi 5 / 45
Contenitori top-level Componenti al livello superiore di ogni gerarchia di componenti JDialog JFrame JApplet 6 / 45
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 7 / 45
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 Toolbar Panel 8 / 45
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 Slider Menu 9 / 45
Display non interattivi Non modificabili dall'utente Tooltip Label 10 / 45
Display interattivi Forniscono interfacce standard per task comuni (es. Inserire testo: TextField) 11 / 45
Come si lega tutto insieme Esistono 5 diversi layout manager BorderLayout BoxLayout FlowLayout GridBagLayout GridLayout 12 / 45
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 13 / 45
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 14 / 45
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.*; 15 / 45
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); 16 / 45
Alcune istruzioni (cont.) Inserisce il label nel frame (scritta «Hello world») JLabel label = new JLabel("Hello World"); frame.getcontentpane().add(label); 17 / 45
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 18 / 45
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 */ } }); 19 / 45
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); } 20 / 45
Codice (2/2) } public static void main(string[] args) { javax.swing.swingutilities.invokelater( new Runnable() { public void run() { createandshowgui(); } } ); } 21 / 45
Thread Tre tipi di thread Iniziale Event dispatch thread Worker (o backgorund) thread 22 / 45
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 23 / 45
Per iniziare Due metodi per creare la GUI SwingUtilities.invokeLater (schedula il task ed esce) SwingUtilities.invokeAndWait (schedula il task ed attende la fine) 24 / 45
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 25 / 45
Worker threads Usati per task lunghi Es. Caricare dei file per un'animazione 26 / 45
Altro programma di esempio Aggiornare un'etichetta ogni volta che l'utente schiaccia il pulsante 27 / 45
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; 28 / 45
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 29 / 45
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(... )); 30 / 45
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 31 / 45
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); 32 / 45
Definire i listener (cont.) Implementare l'interfaccia al listener public void actionperformed(actionevent e) { } //reazione all'evento... 33 / 45
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); } } 34 / 45
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) 35 / 45
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 "); 36 / 45
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; } 37 / 45
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. } 38 / 45
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(); } }); } } 39 / 45
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 40 / 45
Nuovo JFrame 41 / 45
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 42 / 45
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 43 / 45
ActionListener 44 / 45
Soluzione esercizi Vedere file TestPiloti.zip. 45 / 45