250 likes | 431 Views
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.
E N D
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 istanza classe esterna IGEA 2001/02
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 IGEA 2001/02
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 IGEA 2001/02
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 } // fine classe esterna EggApplet v. applet EggDrag che trascina l’uovo IGEA 2001/02
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 IGEA 2001/02
frame 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(); } } finestra con bordatura e barra del titolo IGEA 2001/02
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 IGEA 2001/02
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 IGEA 2001/02
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) IGEA 2001/02
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 IGEA 2001/02
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); } } } IGEA 2001/02
nozioni base sui frame/2 • la superficie di un frame Swing è ricoperta da quattro lastre • radice (rootPane) • vetro (glassPane) • contenuti (contentPane) • stratificata (layeredPane) IGEA 2001/02
contenimento fra lastre rootPane cattura eventi del mouse layeredPane glassPane contentPane menuBar (opzionale) contiene pannelli a discrezione utente contiene la barra dei menu (se presente) IGEA 2001/02
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 zonedenominate “North”, “South”, “West”, “East” e “Center” IGEA 2001/02
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 IGEA 2001/02
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().add(mioPannello) IGEA 2001/02
esempio • applicazione grafica (JFrame) per il trascinamento di un uovo • classe EggFrame IGEA 2001/02
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. IGEA 2001/02
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 IGEA 2001/02
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(.) IGEA 2001/02
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 IGEA 2001/02
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) IGEA 2001/02
eventi azione • classe ActionEvent • interface ActionListener • actionPerformed(ActionEvent e) • azioni utente che innescano un ActionEvent • pressione di invio in un JTextField • click su pulsante IGEA 2001/02
esempio/2 • applicazione grafica (JFrame) per il trascinamento di un uovo, visualizzazione delle sue cordinate e impostazione coordinate da parte dell’utente • classe EggFrame2 IGEA 2001/02