Introduzione alla programmazione con linguaggio Java ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dott. Dott.ssa Emma Calabresu, Calabresu, Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 6 GUI ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • • AWT e Swing Container, componenti e gestori di layout Il modello ad eventi Ascoltatori e adattatori Componenti e JFC Esercitazione: progettare una GUI ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Programmazione Java SDK 2.0 ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing AWT package • L’Abstract Windows Toolkit funzionalità di base per le (“Graphics User Interface” componenti software riusabili applet e applicazioni Java. (AWT) fornisce le interfacce grafiche – GUI), tramite e compatibili con • Contiene classi che possono essere estese e le loro proprietà ereditate ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Containers e components • Ci sono due tipi principali ci containers – Windows (java.awt.Windows) • Frame: finestra con titolo e angoli resize • Dialog: finestra senza menu bar – Panel (java.awt.Panel): è contenuto all’interno di un altro container (ad esempio una Windows o una sua sottoclasse), individua un’area rettangolare entro la quale possono essere disposti altri componenti • I containers possono contenere al loro interno altri containers e non solo componenti! Ciò permette di costruire interfacce complesse ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Layout Manager La posizione e la dimensione di un componente in un container è determinata da un layout manager – Il container prende un riferimento da una particolare istanza del layout manager e quando ha bisogno di posizionare un componente invoca il layout manager che provvede a realizzare l’azione desiderata (delegazione) – Il layout manager ha controllo totale sui componenti del container – Il layout manager è responsabile del calcolo e della definizione delle dimensioni standard in relazione alle dimensioni attuali dello schermo ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Principali Layout Manager Il layout manager in un container viene gestito da un layout manager che tipicamente viene associato per default a ciascun container (come un Panel o un Frame); i tipi principali di layout manager sono i seguenti: – – – – – FlowLayout BorderLayout GridLayout CardLayout GridBagLayout È possibile cambiare layout manager chiamando il metodo “setLayout()” ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Default Layout Manager Component Container Windows Frame Dialog Panel Applet FlowLayout BorderLayout ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing FlowLayout B1 B2 B3 • Default layout per i Panel • I componenti si aggiungono da sinistra verso destra • L’allineamento è centrato ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing FlowLayout: esempio import import java.awt.*; java.awt.*; public class public class EsempioDiFlowLayout EsempioDiFlowLayout {{ private private Frame Frame myFrame; myFrame; private Button private Button myButtonA; myButtonA; private private Button Button myButtonB; myButtonB; public void esegui() public void esegui() {{ myFrame = new Frame(“Questo è un esempio”); myFrame = new Frame(“Questo è un esempio”); myFrame.setLayout(new myFrame.setLayout(new FlowLayout()); FlowLayout()); myButtonA = new Button(“Funzione myButtonA = new Button(“Funzione A”); A”); myButtonB myButtonB == new new Button(“Funzione Button(“Funzione B”); B”); myFrame.add(myButtonA); myFrame.add(myButtonA); myFrame.add(myButtonB); myFrame.add(myButtonB); myFrame.pack(); myFrame.pack(); myFrame.setVisible(true); myFrame.setVisible(true); }} public public static static void void main main (Strings (Strings args[]) args[]) {{ EsempioDiFlowLayout myFL EsempioDiFlowLayout myFL == new new EsempioDiFlowLayout(); EsempioDiFlowLayout(); myFL.esegui(); myFL.esegui(); }} }} ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing BorderLayout B1 B4 B5 B2 ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } B3 AWT e Swing GridLayout B1 B2 B3 B4 B5 B6 • I componenti si aggiungono da sinistra a destra, dall’alto verso il basso • Ogni regione viene dimensionata allo stesso modo • Tramite il costruttore si specificano le righe e le colonne ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing GridBagLayout B1 B2 B3 B4 B5 B6 B7 B8 ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Programmazione Java SDK 2.0 ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Eventi • Gli eventi sono oggetti che descrivono cosa accade • La sorgente di eventi (event source) è il generatore di un evento • Il manipolatore di eventi (event heandler) è il metodo che riceve un oggetto evento, lo decifra, ed elabora l’interazione con l’utente Quando un utente compie un’azione sull’interfaccia (preme un bottone o clicca il mouse), ciò causa un evento che può essere gestito dal programma che lo rileva ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Event Handling – Modello gerarchico (JDK 1.0) • Basato sul meccanismo del contenitore e del contenuto • Gli eventi sono da prima trasmessi al componente soggetto dell’azione, e poi propagati nei contenitori secondo l’ordine gerarchico • Gli eventi che non vengono gestiti da un handler automaticamente, continuano a propagarsi ai componenti del container – Modello a delega (JDK 1.1) • Gli eventi sono gestiti dal componente a partire dal quale tale evento è stato originato, ma consente a ciascun componente di propagarlo verso una o più classi particolari chiamate listener • I listener contengono event headler in grado di ricevere ed elaborare gli eventi ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi JDK 1.0 event model – Vantaggi: • Utilizza principi di programmazione propri dell’object oriented – Si usa la calsse java.awt.Component – Si realizza l’Override del metono headleEvent() – Svantaggi: • L’evento può essere gestito solo dal componente dal quale si è originato o da un elemento gerarchico della catena contenitore contenuto: ciò produce perdite di tempo )CPU cycles) • Per gestire l’evento si devono creare sottoclassi del componente che riceve l’evento o creare un metodo alla base del container (vertice gerarchia) ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi JDK 1.1 event model – Vantaggi: • Gli eventi vengono gestiti accidentalmente come accade nel modello JDK 1.0 nel quale il contenitore può trovarsi a dover gestire ciò che il contenuto non è riuscito a gestire • Si possono costruire filtri (adapter) per classificare i tipi di azioni • Si crea una migliore distribuzione del lavoro di gestione degli eventi su tutte le calssi – Svantaggi: • I due modelli visti non possono essere combinati fra loro ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Esempio import import java.awt.*; java.awt.*; Import Import java.awt.event.*; java.awt.event.*; public class public class TwoListener TwoListener implements implements MouseMotionListener, MouseMotionListener, MouseListener MouseListener {{ private Frame f; private Frame f; private private TextField TextField tf; tf; public void esegui() { public void esegui() { ff == new new Frame(“Two Frame(“Two listener listener example”); example”); f.add(new Label(“Click and Drag the mouse”), BorderLayout.NORTH); f.add(new Label(“Click and Drag the mouse”), BorderLayout.NORTH); tf tf == new new TextField TextField (30); (30); f.add(tf, f.add(tf, BorderLayout.SHOUTH); BorderLayout.SHOUTH); f.addMouseMotionListener(this); f.addMouseMotionListener(this); f.setSize(300,200); f.setSize(300,200); f.setVisible(true); f.setVisible(true); }} }} // // mouse mouse listener listener event event Public Public void void mouseDragged mouseDragged (MouseEvent (MouseEvent e) e) {{ String String s=“Mouse s=“Mouse dragging: dragging: X=“+e.getX()+” X=“+e.getX()+” Y=“+e.getY(); Y=“+e.getY(); tf.setText(s); tf.setText(s); }} Public void mouseEvent (MouseEvent e) { Public void mouseEvent (MouseEvent e) { String String s=“The s=“The mouse mouse is is left left the the building”; building”; tf.setText(s); tf.setText(s); }} …… continua continua ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Esempio Segue Segue …… Puclic void mouseExited (mouseEvent e) { Puclic void mouseExited (mouseEvent e) { String String s=“the s=“the mouse mouse is is left left the the building”; building”; tf.setText(s); tf.setText(s); }} // // Public void mouseMoved (MouseEvente e) {}; Public void mouseMoved (MouseEvente e) {}; // // Unused Unused MouseListener MouseListener methods methods public void mousePressed public void mousePressed (MouseEvent (MouseEvent e) e) {{ }; }; public public void void mouseClicked mouseClicked (MouseEvent (MouseEvent e) e) {{ }; }; public void mouseReleased(MouseEvent e) { }; public void mouseReleased(MouseEvent e) { }; // // main main public public static static void void main main (( )) (String (String args[ args[ ]] )) {{ TwoListen two = new TwoListen( ); TwoListen two = new TwoListen( ); two.esegui( two.esegui( ); ); }} }} ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Adattatori (adaptor classes) • Le classi di ascoltatori che definiamo possono estendere le classi adapter e realizzare un override solo dei metodi necessari • In questo modo ci risparmiamo di indicare le interfacce dei metodi non utilizzati ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Programmazione Java SDK 2.0 ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Caratteristiche chiave delle JFC • Le classi AWT vengono arricchite di nuovi componenti che nel complesso costituiscono le JFC • Le JFC sono componenti GUI e servizi che semplificano drasticamente il progetto di interfacce grafiche complesse e robuste • JFC sono parte integrante di SDK 2 e sono costituite principalmente da cinque API: – AWT, Java 2D, Accessibility, Drag and Drop, Swing • JFC contiene AWT (Swing estende AWT) ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Caratteristiche chiave delle JFC • AWT – GUI tools in grado di soddisfare una larga parte delle applicazioni Java • Java 2D – Fornisce un set di funzionalità avanzate per la grafica 2D e l’elaborazione delle immagini • Accessibility – Mette a disposizione un set di tools avanzati per l’input output non tradizionale (speech processing) • Drag and Drop – Permette l’intercomunicabilità tra applicazioni applicazioni che non supportano java java e • Swing – Fornisce un ricco set di funzionalità per il progetto delle GUI ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } altre Componenti e JFC Componenti Swing ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Componenti Swing JLabel JList JCombobox JScrollPane JSlider JOptionPane JTable JButton JToggleButton ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Swing • Pluggable look and feel – Le applicazioni appaiono indipendenti dalla piattaforma – Sono disponibili componenti personalizzabili • Architettura Swing – Costruite attorno a API che implementano varie parti di AWT – Molte componeneti non utilizzano componenti Platformspecific come AWT (gestione dispositivi grafici) ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Cos’è un’Applet • Una classe Java che puo essere: – Richiamate da una pagina HTML, scaricata ed eseguita da un browser Web – L’applet viene eseguita nell’ambiente di un Web browser, il suo uso è legato al • • • • Caricamento URL Caricamento del documento HTML Caricamento delle classi applet Esecuzione dell’applet Queste quattro fasi sono sequenziali ed effettuate a cura del browser Web ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Applet: sicurezza • Molti browser sono in grado di prevenire – – – – L’esecuzione di un altro programma L’input-output su file Chiamate a metodi nativi Tentativi di apertura di socket su host diversi da quello sul quale è in esecuzione l’applet corrente ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Applet: metodi • init() – Inizializzazioni base per l’applet • start() – Viene chiamato quando l’applet diviene visibile • stop() – Viene chiamato quando l’applet diviene invisibile • destroy() – Utilizzato solo se devono rilasciarsi risorse specifiche (ad esempio thread generati dall’applet) • paint() – Visualizza l’applet ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Progettare una semplice GUI: fasi • Stabilire le funzionalità • Disegnare l’interfaccia utente • Scegliere il layout manager appropriato • Scegliere i componenti in base alle funzionalità (leggere la documentazione) • Implementare il modello ad eventi • Testare il funzionamento ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } ESERCITAZIONE Programmazione Java SDK 2.0 ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Progettare una semplice applicazione in Java • Analisi dei requisiti • Analisi dell’applicazione – La GUI • Event handling – Strutturare le classi • Eccezioni • Streaming I/O • Progetto e implementazione • Testing ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba }