gestione eventi classi interne, frame e pannelli istanza classe interna classi interne definite internamente a un’altra classe ne sono membri ogni istanza di una classe interna esiste all’interno di un’istanza della classe esterna e ha pieno accesso ai membri di questa 6 maggio 2002 IGEA 2001/02 istanza classe esterna 2 repaint() il metodo paint di un’applet non dovrebbe mai essere esplicitamente chiamato è responsabilità della JVM si può chiedere alla JVM di provvedere al ridisegno tramite l’invocazione repaint() no parametri attuali (paint avrebbe richiesto un parametro Graphics) la JVM provvede al ridisegno non appena possibile non chiamare repaint() dal metodo paint errore concettuale 6 maggio 2002 IGEA 2001/02 3 applet che sposta l’uovo public class EggApplet extends Applet { public EggApplet() { egg = new Ellipse2D.Double(0, 0, W, H); MouseClickListener listener = new MouseClickListener(); addMouseListener(listener); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.draw(egg); } private Ellipse2D.Double egg; private static final double W = 30, H = 50; // continua prossima slide 6 maggio 2002 IGEA 2001/02 4 applet che sposta l’uovo/2 // definizione della classe interna private class MouseClickListener extends MouseAdapter { public void mouseClicked(MouseEvent event) { int mouseX = event.getX(); int mouseY = event.getY(); // sposta l'ellisse su (mouseX, mouseY) egg.setFrame(mouseX - W / 2, mouseY - H / 2, W, H); repaint(); // ridisegna, appena possibile } } // fine classe interna MouseClickListener v. applet EggDrag } // fine classe esterna EggApplet che trascina l’uovo 6 maggio 2002 IGEA 2001/02 5 applicazioni grafiche sfruttano il package java.awt a partire da jdk 1.2 il package estensione javax.swing è stato integrato nella distribuzione standard attualmente le applicazione grafiche “più standard” sono quelle costruite tramite javax.swing le uniche realmente multipiattaforma 6 maggio 2002 IGEA 2001/02 6 frame finestra con bordatura e barra del titolo import javax.swing.JFrame; class EggFrame extends JFrame { public EggFrame() { setSize(200, 200); } } public class FrameTest { public static void main (String args[]) { EggFrame f = new EggFrame(); f.setTitle("EggFrame"); f.show(); } } 6 maggio 2002 IGEA 2001/02 7 thread singolo flusso sequenziale di controllo all’interno di un programma in esecuzione argomento avanzato v. tutorial C:\jdk1.3.1_02\tutorial\essential\threads \definition.html percorso essential\threads\definition.html relativo alla cartella base del tutorial 6 maggio 2002 IGEA 2001/02 8 nozioni base sui frame all’avvio del main si attiva il main thread la visualizzazione del frame è l’inizio di un secondo thread (dell’interfaccia grafica) deve essere chiuso esplicitamente con System.exit(.) System.exit(.) termina la JVM corrente non conviene chiamare System.exit(.) nel main poiché il programma terminerebbe immediatamente 6 maggio 2002 IGEA 2001/02 9 chiusura di un frame si realizza chiamando System.exit(.) in seguito al click utente sull’icona di chiusura finestra occorre intercettare gli “eventi finestra” (WindowEvent) 6 maggio 2002 IGEA 2001/02 10 eventi finestra classe WindowEvent interface WindowListener windowOpened(WindowEvent e) windowClosed(WindowEvent e) windowActivated(WindowEvent e) windowDeactivated(WindowEvent e) windowIconified(WindowEvent e) windowDeiconified(WindowEvent e) windowClosing(WindowEvent e) adapter WindowAdapter 6 maggio 2002 IGEA 2001/02 11 chiusura di un frame/2 class EmptyFrame extends JFrame { public EmptyFrame() { setSize(200, 200); WindowCloser listener = new WindowCloser(); addWindowListener(listener); } private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent event) { System.exit(0); } } } 6 maggio 2002 IGEA 2001/02 12 nozioni base sui frame/2 la superficie di un frame Swing è ricoperta da quattro lastre radice (rootPane) vetro (glassPane) contenuti (contentPane) stratificata (layeredPane) 6 maggio 2002 IGEA 2001/02 13 contenimento fra lastre cattura eventi del mouse rootPane layeredPane glassPane contentPane contiene pannelli a discrezione utente 6 maggio 2002 contiene la barra dei menu (se presente) IGEA 2001/02 menuBar (opzionale) 14 pannelli consentono di disegnare classe JPanel di Swing si addizionano alla lastra dei contenuti (contentPane) la lastra dei contenuti può contenere pannelli disposti secondo schemi predefiniti es. “a zone”, con cinque zone denominate “North”, “South”, “West”, “East” e “Center” 6 maggio 2002 IGEA 2001/02 15 disegno in un pannello situazione simile a quelle delle applet metodo paintComponent(Graphics g) invece di paint(Graphics g) la prima istruzione di paintComponent deve essere super.paintComponent(g) per disegnare sfondo, bordi, decorazioni ed impostare gli attributi dell’oggetto Graphics 6 maggio 2002 IGEA 2001/02 16 inserimento pannelli nella lastra dei contenuti metodo add(JPanel mioPannello) applicato all’oggetto contentPane l’oggetto contentPane si ottiene con il metodo getContentPane() applicato all’oggetto JFrame mioJFrame.getContentPane().ad d(mioPannello) 6 maggio 2002 IGEA 2001/02 17 esempio applicazione grafica (JFrame) per il trascinamento di un uovo classe EggFrame 6 maggio 2002 IGEA 2001/02 18 componenti public abstract class Component extends Object oggetti che hanno una rappresentazione grafica possono essere mostrati sullo schermo possono interagire con l’utente pannelli e lastra dei contenuti sono (IS-A) Component altri es.: pulsanti, campi di testo, checkbox, barre di scorrimento ecc. 6 maggio 2002 IGEA 2001/02 19 contenitori public class Container extends Component componenti speciali concepiti per essere “contenitori di componenti” la lastra dei contenuti è un contenitore metodo add(.) per addizionare un componente ogni contenitore ha il proprio “gestore del layout” (o “layout manager”) il layout manager stabilisce come debbono essere disposti i componenti un JPanel IS-A Container 6 maggio 2002 IGEA 2001/02 20 layout manager il layout manager di un contenitore dispone normalmente i componenti “a scorrimento” orizzontalmente e sequenzialmente, andando a capo solo quando lo spazio orizzontale è esaurito il layout manager di una lastra dei contenuti dispone i componenti “a zona” ad ogni contenitore si può associare un nuovo layout manager tramite il metodo setLayout(.) 6 maggio 2002 IGEA 2001/02 21 layout manager/2 setLayout(new FlowLayout()) a scorrimento ciascun componente avrà la sua “ampiezza naturale” setLayout(new BorderLayout()) a zona componenti con ampiezze tali da riempire il contenitore setLayout(new GridLayout(m, n)) a griglia m × n celle di dimensione costante 6 maggio 2002 IGEA 2001/02 22 FlowLayout public class FlowLayout extends Object implements LayoutManager, Serializable un layout a scorrimento organizza i componenti orizzontalmente, da sinistra verso destra (come le linee di testo di un paragrafo) usati spesso per organizzare "pulsanti" in un pannello i pulsanti vengono disposti a riempire lo spazio orizzontale ciascuna linea è centrata i componenti assumeranno la loro dimensione naturale 6 maggio 2002 IGEA 2001/02 23 FlowLayout/2 public class myButtons extends Applet { Button button1, button2, button3; public void init() { button1 = new Button("Ok"); button2 = new Button("Open"); button3 = new Button("Close"); add(button1); add(button2); add(button3); } } 6 maggio 2002 IGEA 2001/02 24 BorderLayout public class BorderLayout extends Object implements LayoutManager2, Serializable default per i Container dispone (e ridimensiona) i componenti per ricoprire le cinque regioni (v. slide n. 21) ciascuna regione può contenere al più un componente se la regione non è specificata il default è "Center" 6 maggio 2002 IGEA 2001/02 25 BorderLayout/2 i componenti avranno la loro dimensione naturale nel rispetto dei vincoli posti dalla dimensione del Container componenti a nord e sud possono essere deformati orizzontalmente componenti ad est e ovest possono essere deformati verticalmente componenti al centro possono essere deformati orizzontalmente e verticalmente 6 maggio 2002 IGEA 2001/02 26 BorderLayout/3 public class buttonDir extends Applet { public void init() { setLayout(new BorderLayout()); add(new Button("North"), BorderLayout.NORTH); add(new Button("South"), BorderLayout.SOUTH); add(new Button("East"), BorderLayout.EAST); add(new Button("West"), BorderLayout.WEST); add(new Button("Center"), BorderLayout.CENTER); } } 6 maggio 2002 IGEA 2001/02 27 GridLayout public class GridLayout extends Object implements LayoutManager, Serializable dispone componenti secondo una griglia rettangolare ciascun rettangolo ha la stessa dimensione il layout manager decide il numero di colonne in base al numero di righe richiesto e al numero di componenti decide anche il numero di righe in base al numero di colonne richiesto e al numero di componenti v. costruttori (C:\j2sdk1.4.0\docs\api\index.html) 6 maggio 2002 IGEA 2001/02 28 GridLayout/2 public class ButtonGrid extends Applet { public void init() { setLayout(new GridLayout(3,2)); add(new Button("1")); add(new Button("2")); add(new Button("3")); add(new Button("4")); add(new Button("5")); add(new Button("6")); } } 6 maggio 2002 IGEA 2001/02 29 campi di testo public class JTextField extends JTextComponent IS-A Component oggetti JTextField realizzano campi di testo consentono l’input/output di stringhe tramite i metodi getText() e setText(.) l’evento più interessante da controllare su un JTextField è la pressione del tasto “invio” (è un ActionEvent) 6 maggio 2002 IGEA 2001/02 30 eventi azione classe ActionEvent interface ActionListener actionPerformed(ActionEvent e) azioni utente che innescano un ActionEvent pressione di invio in un JTextField click su pulsante 6 maggio 2002 IGEA 2001/02 31 esempio/2 applicazione grafica (JFrame) per il trascinamento di un uovo, visualizzazione delle sue cordinate e impostazione coordinate da parte dell’utente classe EggFrame2 6 maggio 2002 IGEA 2001/02 32