Laboratorio di reti I: Applet e GUI Stefano Brocchi [email protected] 10 dicembre, 2008 Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 1 / 46 Inserimento di applet nelle pagine web Concetto di applet Un’applet è una classe Java che può essere eseguita all’interno di una pagina web Quando un browser carica una pagina web contenente un’applet, scarica il codice necessario e lo esegue; per questa operazione è necessario che sia installata una JVM collegata con il browser Visto che il codice viene eseguito lato client è necessario poter garantire la sicurezza degli utenti Questo viene realizzato grazie alla JVM che impedisce qualsiasi operazione potenzialmente pericolosa Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 2 / 46 Inserimento di applet nelle pagine web Limitazioni di un’applet Alcune delle operazioni vietate alle applet sono: La lettura o la scrittura di dati sul file system locale L’apertura di connessioni web verso siti diversi da quello dove è contenuta l’applet La possibilità di terminare la JVM (per esempio con l’istruzione System.halt()) Per applet che necessitano di aggirare queste limitazioni esiste un sistema di firme digitali dove un’ente garante assicura che l’applet è sicura e non può causare danni Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 3 / 46 Inserimento di applet nelle pagine web Il tag applet Per inserire un’applet in una pagina web esiste il tag <applet> Il tag <applet> è tuttavia deprecato in favore del tag <object>, del quale la w3c raccomanda l’utilizzo. Tuttavia la sun sostiene che la specifica di <object> non è tuttore chiara è può portare a comportamenti difformi su diversi browser, raccomandando quindi l’utilizzo di <applet> Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 4 / 46 Inserimento di applet nelle pagine web Uso del tag applet L’attributo code di <applet> specifica il percorso della classe da eseguire. Altri attributi possibili sono: width Per specificare la larghezza dell’applet heigth Per specificarne l’altezza codebase Indicante il percorso di base dell’applet, nel caso in cui code sia un percorso relativo archive Per indicare un’URL rappresentante un file JAR dove è contenuta l’applet align Per specificare l’allineamento dell’applet alt Per un testo che descrive l’applet nel caso in cui questa non possa venir visualizzata name Per specificare un nome per l’applet, utile per la comunicazione con altre applet nella stessa pagina Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 5 / 46 Inserimento di applet nelle pagine web Uso del tag applet Dentro il tag <applet> è possibile specificare una serie di tag <param> per specificare i parametri da passare all’applet I due attributi name e value permettono di specificare, rispettivamente, il nome ed il valore del parametro Vediamo un esempio di codice HTML per l’inserimento di un’applet; in questo caso si presuppone che l’applet sia rappresentata dalla classe myApplet.class contenuta nella stessa cartella del documento HTML che la contiene <applet code="myApplet.class" width=640 height=480> <param name="Parametro1" value="Valore1"> <param name="Parametro2" value="Valore2"> </applet> Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 6 / 46 Realizzazione di un’applet La classe Applet Un’applet deve essere realizzata una sottoclasse della classe Applet presente nel pacchetto java.Applet (o di javax.swing.JApplet, sua derivata) La classe Applet deriva dalla classe Panel del pacchetto per la grafica java.awt. Le altre sue sovraclassi sono Container e Component Essendo un’applet un oggetto grafico input ed output devono essere gestiti in modo diverso; lo standard output e lo standard error non sono normalmente visibili all’utente Per fini di debugging ed analisi del programma i browser mettono a disposizione solitamente una console Java dove il programmatore può vedere standard output ed error, ed eventualmente altre informazioni a proposito delle operazioni svolte per l’esecuzione dell’applet Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 7 / 46 Realizzazione di un’applet Metodi della classe Applet: init e start La JVM richiamerà automaticamente quattro metodi dell’applet: il metodo init(), start(), stop() e destroy(). Questi saranno quindi i metodi da riscrivere per lo sviluppo di un’applet Il metodo init() viene richiamato una sola volta durante la vita dell’applet appena questa è stata caricata in memoria Il metodo start() viene richiamato quando la pagina contenente l’applet viene aperta. Se la pagina viene chiusa e riaperta più volte, questo metodo può essere invocato più di una volta Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 8 / 46 Realizzazione di un’applet Metodi della classe Applet: stop e destroy Il metodo stop() viene richiamato quando la pagina contenente l’applet viene chiusa. Come per start(), tale metodo può essere chiamato più volte durante la vita dell’oggetto Il metodo destroy() viene richiamato una sola volta per ogni applet quando questa viene rimossa dalla memoria; solitamente viene richiamato nel momento in cui il browser viene chiuso. In questo metodo è necessario rilasciare le risorse acquisite dall’oggetto Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 9 / 46 Realizzazione di un’applet Altri metodi della classe Applet Vediamo altri metodi contenuti nella classe Applet public String getParameter(String name) Ritorna un parametro passato all’applet con un determinato nome public URL getDocumentBase() Ottiene l’URL della pagina contenente l’applet public URL getCodeBase() Restituisce l’URL della cartella contenente il codice dell’applet public AppletContext getAppletContext() Restituisce un oggetto di tipo AppletContext rappresentante il contesto dell’applet ed utile per effettuare richieste all’ambiente circostante Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 10 / 46 Realizzazione di un’applet La classe AppletContext La classe AppletContext mette a disposizione vari metodi tra cui: public void showDocument(URL url) Richiede al browser di mostrare nella pagina corrente l’URL specificata; se l’URL rappresenta un file che il browser non sa interpretare direttamente (che non è per es. una pagina html o un’immagine) solitamente questo aprirà una finestra per il download public void showDocument(URL url, String target) Richiede al browser di mostrare l’URL specificata in un’altra finestra specificata dalla stringa target. Questa può o rappresentare il nome della finestra o contenere i valori self, parent, top o blank. Il browser è libero di ignorare la richiesta (per esempio nel caso abbia un gestore di popup) Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 11 / 46 Realizzazione di un’applet La classe AppletContext La classe AppletContext contiene inoltre metodi per la comunicazione fra le varie applet presenti nella stessa pagina public Applet getApplet(String name) Restituisce l’applet associata ad un determinato nome tramite l’attributo name nel codice HTML public Enumeration<Applet> getApplets() Restituisce tutte le applet nella pagina corrente Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 12 / 46 Realizzazione di un’applet La classe AppletContext Presenti infine metodi che permettono la comunicazione fra le varie applet tramite stream public void setStream(String key, InputStream stream) (dalla JDK 1.4) Rende disponibile un determinato InputStream alle altre applet della pagina; a tale stream viene associato una chiave key public InputStream getStream(String key) (dalla JDK 1.4) Ottiene un determinato stream associato alla chiave key; per ragioni di sicurezza sono visibili solo gli stream forniti da applet con lo stesso codebase public Iterator<String> getStreamKeys() (dalla JDK 1.4) Restituisce tutte le chiavi degli stream a disposizione Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 13 / 46 Creazione di una GUI in Java Creazione di una GUI in Java Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 14 / 46 Creazione di una GUI in Java Le Graphic User Interfaces Essendo in un’applet lo standard input e lo standard output occultati per comunicare con l’utente è necessario creare e gestire un’interfaccia grafica (GUI, Graphic User Interface) Lo sviluppo di interfacce grafiche può essere utile anche in altri tipi di applicazioni in quanto rendono solitamente l’uso di un programma più semplice ed immediato Grazie alla generalità delle classi Java per le interfacce, queste possono essere utilizzate nello stesso modo per gestire contesti diversi, come applet o applicazioni a finestre I pacchetti Java utilizzabili per lo sviluppo di interfacce grafiche sono principalmente due: java.awt e javax.swing Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 15 / 46 Creazione di una GUI in Java Swing ed awt Awt e swing Le classi nel pacchetto awt (Abstract Window Toolkit) offrono un’ampia gamma di funzionalità e di oggetti grafici. Il compito di rappresentarli è rimandato al sistema operativo; per questo si parla di componenti heavyweight Le classi nel pacchetto swing offrono tutti gli oggetti grafici della classe awt e qualche componente aggiuntivo; gli oggetti di tipo swing si appoggiano per la loro realizzazione ad oggetti awt. La principale differenza tra i due pacchetti è che per gli oggetti swing la rappresentazione grafica viene definita nel codice Java. Per questo le componenti swing sono dette lightweight Solitamente ad ogni classe di awt corrisponde una classe swing con le stesse funzionalità, il cui nome è uguale a quello della prima classe con una J per prefisso Es. Button e JButton, oppure Label e JLabel Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 16 / 46 Creazione di una GUI in Java Swing ed awt Vantaggi di Awt La scelta tra awt e swing può essere fatta soppesando le caratteristiche che queste mettono a disposizione. Vediamo di seguito alcune caratteristiche vantaggiose di awt Maggiore efficienza per la creazione e la manipolazione di oggetti grafici, grazie all’uso diretto delle risorse di sistema (es. directx) Essendo gli oggetti grafici di awt rappresentati dal sistema, le GUI scritte in awt avranno più possibilità di essere simili alle altre già presenti nel sistema Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 17 / 46 Creazione di una GUI in Java Swing ed awt Vantaggi di Swing Vediamo di seguito invece alcune caratteristiche vantaggiose del pacchetto swing Maggiore indipendenza dalla piattaforma, visto che la grafica è definita nel codice Java. In awt, essendo la rappresentazione fatta dal sistema, può succedere che interfacce uguali vengano rappresentati diversamente su diversi sistemi Un maggior numero di oggetti grafici a disposizione, e possibilità di definire uno spettro più vasto di loro funzionalità. Questo è reso possibile dall’indipendenza dal sistema Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 18 / 46 Creazione di una GUI in Java Swing ed awt Uso di Awt e Swing Qualunque sia la scelta per lo sviluppo di GUI per garantire il funzionamento è necessario evitare di mischiare componenti awt e swing La classe Applet è un oggetto grafico che supporta awt; invece la classe JApplet è pensata per l’uso delle classi swing Per la creazione di interfacce grafiche esistono numerosi editor visuali. E’ comunque importante capire bene i meccanismi dietro il funzionamento di una GUI Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 19 / 46 Creazione di una GUI in Java Componenti grafici di base La classe Component La classe Component è la classe dal quale derivano tutti gli oggetti grafici Alcune delle sue sottoclassi: Button e JButton, rappresentanti pulsanti Label e JLabel, rappresentanti etichette (zone di testo non modificabili dall’utente) Checkbox e JCheckbox, rappresentanti caselle selezionabili TextArea e JTextArea, rappresentanti aree di testo Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 20 / 46 Creazione di una GUI in Java Componenti grafici di base Componenti grafici di base: bottoni ed etichette Vediamo alcune funzionalità di alcuni componenti grafici di base Button e JButton L’etichetta sul pulsante si può definire tramite il costruttore che prende una stringa, o manipolare tramite getLabel() o setLabel(String label) Label e JLabel Il testo rappresentato può essere impostato tramite il costruttore o setText(String text). Metodi per l’allineamento sono getAlignment() e setAlignment(int alignment) Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 21 / 46 Creazione di una GUI in Java Componenti grafici di base Componenti grafici di base: checkbox ed aree di testo Checkbox e JCheckbox L’etichetta della casella può essere impostata nel costruttore o con il metodo setLabel(String label). Lo stato della casella è accessibile tramite i metodo getState() e setState(boolean state) TextArea e JTextArea Il testo contenuto può essere impostato nel costruttore o tramite il metodo setText(String text) ed estratto tramite il metodo getText(). Si può impostare che l’area di testo sia modificabile dall’utente (come succede in un form) tramite il metodo setEditable(boolean editable) Esistono numerosissime altre funzionalità per ogni componente. Il loro utilizzo ed i metodi a disposizione sono solitamente molto intuitivi. Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 22 / 46 Creazione di una GUI in Java Contenitori grafici La classe Container Esistono componenti grafici che possono contenere altri oggetti grafici, come le finestre. Questi sono rappresentati tramite le classi derivatanti da Container La classe Container rappresenta sostanzialmente un oggetto grafico nel quale si possono includere altri componenti Le classi Applet e JApplet derivano da Container Le sottocomponeti si possono aggiungere tramite il metodo public void add(Component comp) Esiste una variante di add che permette di specificare, in un intero, un indice da associare ad un determinato componente. Questo può servire per influenzare il layout, come spiegato in seguito Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 23 / 46 Creazione di una GUI in Java Contenitori grafici La classe Container Vediamo un esempio di codice per inserire bottone in un’applet, da inserire solitamente nel metodo init: Button b = new Button("Bottone"); add(b); Sebbene la classe JApplet sia anche essa di tipo Container, questa contiene un altro oggetto Container che rappresenta il suo contenuto grafico. I componenti vanno aggiunti a tale oggetto, ottenibile tramite il metodo getContentPane() Il codice per inserire il bottone b in una JApplet quindi è: getContentPane().add(b); Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 24 / 46 Creazione di una GUI in Java Il layout Il layout La disposizione delle componenti in un oggetto grafico viene determinata da un oggetto di tipo LayoutManager, che ne deciderà la posizione ed eventualmente la dimensione Il LayoutManager di un determinato contenitore può essere impostato tramite il metodo setLayout(LayoutManager lm) di Container E’ possibile specificare ad un LayoutManager la posizione per un determinato componente tramite il valore intero passato al metodo add Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 25 / 46 Creazione di una GUI in Java Il layout Il layout: classe FlowLayout Vediamo come esempio di LayoutManager la classe FlowLayout La classe FlowLayout posiziona i componenti passati in add da sinistra a destra e, al riempimento delle righe, dall’alto in basso Si può alterare l’ordine in cui i componenti vengono posizionati tramite gli interi passati al metodo add E’ possibile imporre un determinato allineamento dei componenti su ogni riga tramite il metodo setAlignment(int align). I valori accettati dal metodo sono rappresentati come costanti nella classe stessa Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 26 / 46 Creazione di una GUI in Java Il layout Il layout: classe FlowLayout Vediamo un esempio dove visualizziamo tre pulsanti allineati a destra. Se usiamo classi swing, i metodi setLayout e add vanno richiamati sul ContentPane come descritto precedentemente FlowLayout fl = new FlowLayout(); fl.setAlignment(FlowLayout.RIGHT); setLayout(fl); Button b = new Button("Pulsante"); Button b2 = new Button("Pulsante 2"); Button b3 = new Button("Pulsante 3"); add(b); add(b2, 0); add(b3); Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 27 / 46 Creazione di una GUI in Java Il layout Il layout: classe FlowLayout Tramite il codice di esempio mostrato, inserito per esempio nel metodo init() di un’applet, si ottiene la seguente interfaccia: Il pulsante 2 si trova alla sinistra degli altri perchè nella relativa istruzione add è stato specificato di inserirlo in prima posizione (la posizione 0). Avremmo ottenuto lo stesso risultato richiamando add prima su b2 e poi sugli altri bottoni Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 28 / 46 Creazione di una GUI in Java Il layout Annidare oggetti Container Esistono molti altri LayoutManager con specifiche e caratteristiche simili a FlowLayout. Fare riferimento alla documentazione Java E’ possibile definire zone interne ad un layout che contengono componenti disposti in modo diverso. Questo si può ottenere aggiungendo un Container alla zona grafica, definendo un altro LayoutManager per tale oggetto. In questo caso i componenti aggiunti al Container annidato verranno posizionati secondo le sue regole di layout Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 29 / 46 Creazione di una GUI in Java Il layout Annidare oggetti Container Vediamo un esempio di annidamento di oggetti container, e l’aspetto dell’interfaccia risultante setLayout(new FlowLayout()); Container c = new Container(); c.setLayout(new GridLayout(2,1)); c.add(new Checkbox("Checkbox 1")); c.add(new Checkbox("Checkbox 2")); add(new Button("Bottone")); add(c); add(new Button("Bottone 2")); Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 30 / 46 Creazione di una GUI in Java Il layout Layout manuale Si può anche impostare che il layout sia definito nel codice componente per componente, specificando null come LayoutManager In questo caso la posizione dei componenti viene definita tramite il metodo setLocation(int x, int y) di Component. Le coordinate specificate sono relative all’angolo in alto a sinistra del Container nel quale il componente viene inserito Se si vuole specificare anche una determinata dimensione per un componente si può usare il metodo setSize(int width, int height) che permette di specificarne altezza e larghezza, oppure setBounds(int x, int y, int width, int height) che ne specifica sia la posizione che la grandezza Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 31 / 46 Creazione di una GUI in Java Annidare contenitori per aggiungere funzionalità Container per funzionalità aggiuntive: ScrollPane L’annidamento di diversi oggetti grafici può essere utilizzato per aggiungere loro delle funzionalità Vediamo per esempio come realizzare l’aggiunta di barre di scorrimento laterali tramite l’uso di ScrollPane (o JScrollPane) Un oggetto ScrollPane è pensato per contenere qualsiasi componente che possa essere troppo grande per l’area a lui assegnata. Lo ScrollPane provvederà a fornire, dove necessarie, delle barre di scorrimento per permettere all’utente di visualizzare tutto il contenuto L’uso di ScrollPane è del tutto uguale a quello di un qualsiasi altro Container. Vediamo un esempio: TextArea ta = new TextArea("Testo molto lungo..."); ScrollPane textScroller = new ScrollPane(); textScroller.add(ta); add(textScroller); Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 32 / 46 Creazione di una GUI in Java Finestre indipendenti: Frame e JFrame Classi Frame e JFrame Per creare interfacce grafiche in una finestra invece che in un’applet è possibile usare le classi Frame o JFrame Una classe di tipo Frame rappresenta una finestra con un bordo ed un titolo Frame deriva da Container, quindi è possibile usare i metodi di Container per impostarne le caratteristiche di base, come setSize() o setLocation() Per visualizzare o nascondere la finestra usare il metodo setVisible(boolean visible) Per cancellare la finestra e tutte le risorse ad essa allocate usare il metodo dispose() Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 33 / 46 Creazione di una GUI in Java Finestre indipendenti: Frame e JFrame Classi Frame e JFrame Per definire il comportamento della finestra al momento della chiusura da parte del sistema (tasto ’x’) usando classi swing, si può usare il metodo setDefaultCloseOperation(int op), che accetta come operazioni interi definiti nella classe javax.swing.WindowConstants. Vediamo un esempio per la creazione di una finestra: JFrame f = new JFrame(); // f.getContentPane().add(...); Aggiunta dei componenti f.setTitle("Titolo"); f.setSize(800, 600); f.setLocation(100, 100); f.setVisible(true); f.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE); Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 34 / 46 Creazione di una GUI in Java Gestione a eventi Gestione a eventi Le interfacce grafiche in Java utilizzano quella che si dice una gestione a eventi. Le classi utilizzate si trovano nel pacchetto java.awt.event Quando si verifica un determinato evento, come la pressione di un bottone o di un determinato tasto della tastiera, Java crea un oggetto di tipo Event che rappresenta questa azione E’ possibile specificare le azioni da svolgere in risposta ad un determinato evento con degli oggetti che restano in ascolto per queste azioni di tipo EventListener Ogni oggetto grafico può generare eventi diversi, e per ognuno di essi può essere definito un diverso EventListener. Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 35 / 46 Creazione di una GUI in Java Gestione a eventi Gestione a eventi Il codice per la gestione di un determinato evento deve essere scritto in un oggetto che estende il relativo EventListener L’oggetto creato può essere associato alla componente che genera l’evento tramite metodi del tipo addXxxListener Quando l’evento si verifica, verranno richiamati i metodi dell’EventListener specificati nella documentazione della componente L’oggetto Event che rappresenta l’evento accaduto verrà passato al metodo dell’EventListener Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 36 / 46 Creazione di una GUI in Java Gestione a eventi Gestione a eventi Vediamo un esempio. La classe Button generano eventi di tipo ActionEvent quando il bottone rappresentato viene premuto. Per gestire eventi di questo tipo sono necessari oggetti di tipo ActionListener. Questi dovranno implementare il metodo actionPerformed(ActionEvent e) Gli ActionListener si possono associare all’oggetto Button tramite il metodo addActionListener Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 37 / 46 Creazione di una GUI in Java Gestione a eventi Gestione a eventi Un esempio di codice: public class click implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Click !"); } } Codice nell’applet (o nella finestra): Button b = new Button("Click me"); b.addActionListener(new click()); add(b); Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 38 / 46 Creazione di una GUI in Java Gestione a eventi Gestione a eventi Consideriamo un altro esempio. La classe TextArea genera eventi di tipo KeyEvent quando un tasto viene premuto mentre il cursore è nell’area di testo Per gestire eventi di questo tipo sono necessari oggetti di tipo KeyListener. Questi dovranno implementare i tre metodi keyPressed(KeyEvent e), keyReleased(KeyEvent e) e keyTyped(KeyEvent e) I KeyListener si possono associare all’oggetto TextArea tramite il metodo addKeyListener Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 39 / 46 Creazione di una GUI in Java Gestione a eventi Gestione a eventi Supponiamo di voler effettuare una determinata azione alla pressione di invio. Questo si può realizzare implementando il seguente KeyListener public class enter implements KeyListener { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { System.out.println("Enter !"); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 40 / 46 Creazione di una GUI in Java Gestione a eventi Classi Adapter Quando si vuole realizzare un EventListener che reagisce solo per alcuni dei metodi dell’interfaccia da implementare, è comodo usare una classe di tipo Adapter Una classe di tipo Adapter implementa semplicemente il relativo EventListener senza effettuare alcuna operazione quando i metodi vengono richiamati La classe enter potrebbe quindi essere riscritta con il seguente codice: public class enter extends KeyAdapter { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { System.out.println("Enter !"); } } } Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 41 / 46 Creazione di una GUI in Java Gestione a eventi Alcuni tipi di eventi Vediamo alcuni tipi di eventi, da quale oggetto questi possano venir generati e con che classi vadano gestiti Evento ComponentEvent FocusEvent MouseEvent MouseEvent ActionEvent TextEvent ItemEvent WindowEvent Generato da Component Component Component Component (J)Button (J)TextArea (J)Checkbox Window o (J)Frame Listener ComponentListener FocusListener MouseListener MouseMotionListener ActionListener TextListener ItemListener WindowListener Metodo addXxxListener addComponentListener addFocusListener addMouseListener addMouseMotionListener addActionListener addTextListener addItemListener addWindowListener Nel caso si usi awt, sarà necessario intercettare un WindowEvent per permettere la chiusura di una finestra Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 42 / 46 Creazione di una GUI in Java Gestione a eventi Uso di classi interne Spesso per realizzare oggetti Listener si utilizzano classi interne Una classe interna è una classe la cui definizione è annidata in un’altra classe L’accesso ad una classe interna non statica può avvenire solo tramite un oggetto della classe che la contiene Un vantaggio di una classe interna è la possibilità di accedere a matodi e campi dell’oggetto che la contiene Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 43 / 46 Creazione di una GUI in Java Gestione a eventi Uso di classi interne Vediamo un possibile esempio della struttura di un’applet con un Listener al suo interno public class classeInterna extends Applet { public void eseguiAzione() { ... } public void init() { Button b = new Button("Click me"); b.addActionListener(new interna()); add(b); } public class interna implements ActionListener { public void actionPerformed(ActionEvent e) { eseguiAzione(); } } } Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 44 / 46 Creazione di una GUI in Java Esercizio Esercizio Implementare un’applet che visualizzi un file di testo presente sul server in un’area di testo, se necessario con barre di scorrimento Il file di testo da visualizzare deve essere inserito dall’utente in un’altra area di testo. Tale url può essere assoluta o relativa Tener presente che per motivi di sicurezza le url esterne al sito dell’applet non sono raggiungibili. La visualizzazione deve avvenire alla pressione di un apposito pulsante di avvio Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 45 / 46 Creazione di una GUI in Java Esercizio Esercizio Opzionalmente, inserire anche le seguenti funzionalità In caso l’utente specifichi un’url non valida, indichi una risorsa che non contiene testo o nel caso si verifichi un qualsiasi altro errore, stampare un messaggio che descrive il problema nell’area di testo dedicata all’output. Avviare la visualizzazione del file anche alla pressione del tasto invio nell’area di testo di input Stampare un messaggio di attesa mentre il file viene scaricato. Mettere inoltre a disposizione un tasto ’interrompi’ che permetta di fermare lo scaricamento del file in qualsiasi momento Per verificare il funzionamento di quest’ultima opzione, inserire delle pause ’artificiali’ durante il download o visualizzare tramite l’applet un file di testo molto grande Stefano Brocchi Laboratorio di reti I: Applet e GUI 10 dicembre, 2008 46 / 46