Programmazione ad Eventi

Slides:



Advertisements
Presentazioni simili
Java e le interfacce grafiche
Advertisements

Unit à E4 Applet. Obiettivi Saper progettare e realizzare Applet Java allinterno di pagine HTML Comprendere le interazioni tra il browser e lapplet Saper.
Costruttori e Distruttori
Applet Java.
Unit à E3 Eventi. Obiettivi Conoscere il concetto di evento e gestore di evento Conoscere i pulsanti in Swing e la gestione dellevento clic Saper gestire.
26/10/2004Laboratorio di Programmazione - Luca Tesei1 Variabili e Oggetti Lo spazio di memoria di Java Le API di Java.
Massa Laura Mela Enrica
Programmazione Ingegneria TLC
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Il linguaggio java Esercitazioni del corso di Sistemi Informativi
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
GUI Graphical Users Interfaces
Elementi di programmazione grafica
Elementi di programmazione grafica
Interfacce. Interfacce come strumento di progetto Scelta delle classi di un progetto Criteri di coesione e accoppiamento Interfacce e riuso di codice.
Grafica Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA Uff
Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Swing e la programmazione a eventi
Swing e la programmazione a eventi
Introduzione a JFC/Swing
Grafico di funzione Disegna la Matematica.
1 Eventi/2 Più movimento alle classi. 2 Eventi Java Modo per intercettare il verificarsi di certe condizioni / azioni e fare in modo che venga eseguito.
Esercizi di grafica ….
1 Grafica ed eventi/2 Più movimento alle classi. 2 Esercizio n.1 Realizzare una applicazione che permette il trascinamento di una ellissi allinterno di.
Più movimento alle classi
Gestione eventi esercitazione n aprile 2006.
Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 71 Uso dellinterfaccia Runnable interface Runnable { public void run ( ); } Linterfaccia.
Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 81 Gestione dei colori La gestione dei colori in AWT consente di specificare un qualunque.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Approfondimento delle classi
AA2003/04 © M.A. Alberti Programmazione Interfacce 1 Programmazione Corso di laurea in Informatica.
Ereditarietà. Concetti principali Ereditarietà e (overriding) di metodi Dynamic dispatch e polimorfismo Ereditarietà e costruttori Livelli di accesso.
Ereditarietà. Concetti principali Ereditarietà e (overriding) di metodi Dynamic dispatch e polimorfismo Ereditarietà e costruttori Livelli di accesso.
Progetto di applicazioni grafiche. Disegno di forme complesse Prassi : un classe per ciascuna forma Progetta la forma individuando le componenti base.
Programmazione ad Oggetti AA 2011– Contenuti del corso Modulo A Tecniche di programmazione Docente: Prof. Michele Bugliesi Modulo B Tecniche di.
Programmazione con Interfacce
Ping Pong. PingPongComponent.java Interfaccia pubblica della componente public class PingPongComponent extends JComponent { // crea una component da includere.
Capitolo 2 Utilizzare oggetti
Capitolo 9 Interfacce e polimorfismo
Capitolo 10 Ereditarietà
Capitolo 3 Realizzare classi
JAVA E LA GRAFICA L’architettura Java è graphics-ready
APPLICAZIONI & APPLET Java è un ottimo linguaggio per costruire applicazioni anche non per Internet anche non grafiche ma si è diffuso storicamente, e.
1 Se seleziono le colonne da A – F e modifico con il mouse la larghezza della colonna C, cosa succede alle altre colonne selezionate? 1.Assumono tutte.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Swing.
Esercizi Swing.
Modulo 6 Test di verifica
Aggiungiamo Elementi al Frame Per poter posizionare un elemento all'interno di un frame dobbiamo utilizzare il "layout manager". Ogni contenitore (Container)
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2014/15 Libreria standard.
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Java gestione eventi introduzione. La gestione degli eventi Ci sono 3 oggetti interessati alla g. d. e.: L’oggetto interessato (event source) ad esempio.
LABVIEW Sommario Che cosa è uno strumento virtuale (VI) creato con LABVIEW Parti di un VI: pannello frontale diagramma a blocchi Confronto tra il principio.
Programmazione ad oggetti
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Interfacce grafiche Capitolo 27 marzo 2004 Interfacce grafiche.
Timer Animazioni.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Capitolo 12 Thread Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Graphics Disegno a mano libera.
Java terzo contatto Swing Java.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
La gestione degli eventi
Esercitazione  obiettivo: scrivere una applicazione per il gioco “Centra Bersaglio”  metodo individuazione e definizione delle classi necessarie.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
Paradigma di programmazione event-driven
Transcript della presentazione:

Programmazione ad Eventi

Eventi, Sorgenti, e Listeners Una interfaccia utente deve gestire una moltitudine di eventi eventi da tastiera, del mouse, click su pulsanti, … Opportuno poter discriminare diversi eventi componenti specifiche devono poter essere programmate senza preoccuparsi che di eventi specifici Necessario avere meccanismi per gestire eventi in modo selettivo Un meccanismo per dichiarare quali eventi si intendono gestire Continua…

Eventi, Sorgenti, e Listeners Oggetto che viene notificato dell’occorrere di un evento I suoi metodi descrivono le azioni da eseguire in risposta ad un evento Sorgente di eventi: Oggetto che origina eventi, o li emette, Notifica l’evento ai propri listeners Vari tipi di sorgenti Componenti visuali: JButton, JTextField, ... Timer, … Continua…

Eventi, Sorgenti, e Listeners Ogni sorgente genera un insieme ben definito di eventi determinato dal tipo della sorgente Eventi di basso livello mouse-down/up/move, key-press/release, component-resize/move, … Eventi “semantici” ActionEvent: click su un JButton, doppio-click su un JListItem, tick di un Timer TextEvent: JTextField modificato da uno o più mouse/key events Continua…

Eventi, Sorgenti, e Listeners Gestione mirata degli eventi Una applicazione può decidere quali eventi gestire tra quelli generati da ciascuna sorgente Registra su ciascuna componente solo i listeners degli eventi che intende gestire Continua…

Eventi, Sorgenti, e Listeners Esempio: utilizziamo una componente JButton per realizzare un pulsante: associamo a ciascun pulsante un ActionListener Ricordiamo: Dobbiamo fornire una classe il cui metodo actionPerformed contiene le istruzioni da eseguire quando il pulsante viene premuto public interface ActionListener { void actionPerformed(ActionEvent event); } Continua…

Eventi, Sorgenti, e Listeners event contiene informazioni sull’evento (ad esempio l’istante in cui è occorso) Associamo il listener al pulsante, registrandolo sul pulsante: addActionListener(): un metodo di JButton ActionListener listener = new ClickListener(); button.addActionListener(listener); void addActionListener(ActionListener l);

File ClickListener.java 01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: 04: /** 05: Un action listener che stampa un messaggio 06: */ 07: public class ClickListener implements ActionListener 08: { 09: public void actionPerformed(ActionEvent event) 10: { 11: System.out.println("I was clicked."); 12: } 13: }

File ClickTester.java Continua… 01: import java.awt.event.ActionListener; 02: import javax.swing.JButton; 03: import javax.swing.JFrame; 04: 05: /** 06: Come installare un ActionListener. 07: */ 08: public class ClickTester 09: { 10: public static void main(String[] args) 11: { 12: JFrame frame = new JFrame(); 13: JButton button = new JButton("Click me!"); 14: frame.add(button); 15: Continua…

File ClickTester.java Continua… 16: ActionListener listener = new ClickListener(); 17: button.addActionListener(listener); 18: 19: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 20: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21: frame.setVisible(true); 22: } 23: 24: private static final int FRAME_WIDTH = 100; 25: private static final int FRAME_HEIGHT = 60; 26: } Continua…

File ClickListener.java Output:

Domande Chi è la sorgente nella applicazione ButtonTester ? Perché è legale passare un ClickListener per un parametro di tipo ActionListener?

Risposte La sorgente è il JButton Perchè ClickListener è sottotipo di ActionListener

Applicazioni con pulsanti Esempio: costruiamo una interfaccia grafica per calcolare gli intessi di un conto bancario Assumiamo dato il tasso di interesse Ad ogni click aggiungiamo al saldo gli intessi Continua…

Applicazioni con pulsanti L’applicazione ha due componenti Back-end: il conto bancario con i suoi metodi Front-end : l’interfaccia grafica che permette l’interazione con il backen Elementi del front-end un JButton per il pulsante Una JLabel per visualizzare il saldo: JButton button = new JButton("Add Interest"); JLabel label = new JLabel("balance="+account.getBalance()); Continua…

Applicazioni con pulsanti Utilizziamo un JPanel come contenitore per raggruppare gli elementi della interfaccia all’interno della finestra di interazione Aggiungiamo prima il pulsante, poi l’etichetta Vengono disposti da sinistra a destra, in ordine JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); Continua…

File BankAccountGUI.java import java.awt.event.*; import javax.swing.*; /** Interfaccia Grafica per un BanckAccount. */ public class BankAccountGUI { public static void main(String[] args) { JFrame frame = new JFrame(); // L’etichetta per visualizzare il saldo final JLabel label = new JLabel( "balance=" + account.getBalance()); Continua…

File BankAccountGUI.java // Il pulsante che aggiorna il saldo JButton button = new JButton("Add Interest"); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { // account è il conto su cui si agisce double interest = account.getBalance() * INTEREST_RATE / 100; account.deposit(interest); label.setText( "balance=" + account.getBalance()); } }; button.addActionListener(listener); Continua…

File BankAccountGUI.java // Il JPanel che contiene le componenti dell’interfaccia JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } // fine main() Continua…

File BankAccountGUI.java // Il conto bancario su cui agire private static BankAccount account = new BankAccount(INITIAL_BALANCE); private static final double INTEREST_RATE = 10; private static final double INITIAL_BALANCE = 1000; private static final int FRAME_WIDTH = 400; private static final int FRAME_HEIGHT = 100; }

Domanda Perché label è dichiarata final mentre button e account non lo sono?

Risposta Perché label é una locale che viene riferita dalla classe interna mentre button è anch’esso local ma non viene riferito account è un campo e quindi si può riferire da una classe interna

Input con JTextField Continua…

Input con JTextField JTextField la componente che permette di ottenere input Associamo ad ogni campo di testo una JLabel per chiarire il senso dell’input final int FIELD_WIDTH = 10; // numero di caratteri final JTextField rateField = new JTextField(FIELD_WIDTH); JLabel rateLabel = new JLabel("Interest Rate: "); Continued…

Input con JTextField La lettura dell’input dal JTextField è la conseguenza di un evento: Due modi per ottenere l’evento: diamo enter sul campo testo segnaliamo la fine dell’input con un pulsante Continua…

Input con JTextField La lettura avviene notificando un action listener Registriamo il listener sia sul pulsante sia sul campo testo class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { double rate = Double.parseDouble(rateField.getText()); . . . } }

File BankAccountGUI2.java import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; /** Interfaccia Grafica per un BanckAccount */ public class BankAccountGUI2 { public static void main(String[] args) JFrame frame = new JFrame(); Continua…

File BankAccountGUI2.java // L’etichecca e il campo di testo per l’input JLabel rateLabel = new JLabel("Interest Rate: "); final int FIELD_WIDTH = 10; final JTextField rateField = new JTextField(FIELD_WIDTH); rateField.setText("" + DEFAULT_RATE); // il pulsante che esegue il calcolo JButton button = new JButton("Add Interest"); // l’etichetta per la visualizzazione final JLabel resultLabel = new JLabel( "balance=" + account.getBalance()); Continua…

File BankAccountGUI2.java // il pannello che raccoglie le componenti GUI JPanel panel = new JPanel(); panel.add(rateLabel); panel.add(rateField); panel.add(button); panel.add(resultLabel); frame.add(panel); class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) double rate = Double.parseDouble( rateField.getText()); double interest = account.getBalance() * rate / 100; account.deposit(interest); Continua…

File BankAccountGUI2.java resultLabel.setText( "balance=" + account.getBalance()); } ActionListener listener = new AddInterestListener(); button.addActionListener(listener); rateField.addActionListener(listener); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); // Il conto bancario su cui agire e le costanti private static BankAccount account = new BankAccount(INITIAL_BALANCE); private static final double DEFAULT_RATE = 10; private static final double INITIAL_BALANCE = 1000; private static final int FRAME_WIDTH = 500; private static final int FRAME_HEIGHT = 200;

Aree di testo JTextArea: utilizzabile per gestire più linee di testo nella stessa area Specifichiamo il numero di righe e colonne al momento della creazione: setText: definisce il contenuto (JTextArea, e JTextField) append: aggiunti testo alla fine dell’area final int ROWS = 10; final int COLUMNS = 30; JTextArea textArea = new JTextArea(ROWS, COLUMNS); Continua…

Aree di testo newline per separare le linee di testo Aree di testo di sola lettura textArea.append(account.getBalance() + "\n"); textArea.setEditable(false); // modificabile solo dall’applicazione, non da utente

Aree di testo Scrollbars JTextArea textArea = new JTextArea(ROWS, COLUMNS); JScrollPane scrollPane = new JScrollPane(textArea); Continua…

Esempio

Controllo del layout Ovvero, controllo della disposizione dei componenti all’interno di una finestra Abbiamo visto applicazioni con una disposizione di componenti elementare I pannelli che abbiamo utilizzato dispongono le componenti in ordine, da sinstra verso destra Per disporre in modo più strutturato utilizziamo pannelli con diverse politiche di disposizione (layout) Continua…

Controllo del layout Ogni contenitore è associato ad un layout manager che definisce la politica di disposizione delle componenti Tre tipologie standard di layout managers border layout flow layout grid layout

Controllo del layout JPanel ha un manager di default: FlowLayout: le componenti vengolo disposte da sinistra a destra utilizzando una nuova riga quando necessario È possibile modificare il layout manager con un metodo corrispondente panel.setLayout(new BorderLayout());

Grid Layout Dispone le componenti in una griglia con un numero predeterminato di righe e colonne Tutte le componeni asssumono le stesse dimensioni Espande ciascuna componente fino a riempire l’area ad essa assegnata

Grid Layout Le componenti si aggiungono per riga, da sinistra a destra: JPanel numberPanel = new JPanel(); numberPanel.setLayout(new GridLayout(4, 3)); numberPanel.add(button7); numberPanel.add(button8); numberPanel.add(button9); numberPanel.add(button4); . . .

Grid Layout

Border Layout Dispone le componenti in aree: Continua…

Border Layout È il layout di default per un JFrame (in realtà per il content pane del frame) Quando aggiungiamo una componente è necessario specificare la posizione: Espande ciascuna componente fino a riempire l’are assegnata se non si vuole questo effetto è necessario includere la componente in un ulteriore pannello panel.add(component, BorderLayout.NORTH);

Pannello di input @ NORTH Esempio Pannello di input @ NORTH ScrollPane @ CENTER

Eventi del mouse mousePressed, mouseReleased: invocati quando un pulsante del mouse viene premuto o rilasciato mouseClicked: invocato quando un pulsante del mouse viene cliccato mouseEntered, mouseExited: il mouse è entrato o è uscito dall’area della componente

Eventi del mouse Catturati da MouseListeners public interface MouseListener { // un metodo per ciascun mouse event su una componente void mousePressed(MouseEvent event); void mouseReleased(MouseEvent event); void mouseClicked(MouseEvent event); void mouseEntered(MouseEvent event); void mouseExited(MouseEvent event); } Continua…

Eventi del mouse Se vogliamo che una componente reagisca ad eventi del mouse dobbiamo registrare un MouseListener sulla componente: public class MyMouseListener implements MouseListener { // Implementa i cinque metodis } MouseListener listener = new MyMouseListener(); component.addMouseListener(listener); Continua…

Eventi del mouse Esempio: estendiamo l’applicazione che visualizza un rettangolo aggiungendo la possibilità di spostare il rettangolo attraverso un click del mouse Il rettangolo si sposta nella posizione sulla quale il mouse avviene il click del mouse

File RectangleComponent.java import java.awt.*; import javax.swing.JComponent; /** Sposta il rettagolo con un click del mouse. */ public class RectangleComponent extends JComponent { public RectangleComponent() box = new Rectangle(BOX_X, BOX_Y, BOX_WIDTH, BOX_HEIGHT); } public void moveTo(int x, int y) box.setLocation(x, y); public void paintComponent(Graphics g) ((Graphics2D)g).draw(box); Continua…

File RectangleComponent.java private Rectangle box; private static final int BOX_X = 100; private static final int BOX_Y = 100; private static final int BOX_WIDTH = 20; private static final int BOX_HEIGHT = 30; }

Eventi del mouse Ora definiamo il mouse listener: quando premiamo il mouse il rettangolo si sposta raggiungendo il mouse Continued…

Mouse Events class MousePressListener extends MouseAdapter { public void mousePressed(MouseEvent event) { int x = event.getX(); int y = event.getY(); component.moveTo(x, y); component.repaint(); } } Tutti i metodi devono essere implementati; implementazione vuota se inutili (meglio usare un Adapter, vedremo)

RectangleMover Output

File RectangleMover.java import java.awt.event.*; import javax.swing.JFrame; /** RectangleComponent interattivo */ public class RectangleMover { public static void main(String[] args) final RectangleComponent component = new RectangleComponent(); Continua…

File RectangleMover.java class MousePressListener implements MouseListener { public void mousePressed(MouseEvent event) component.moveTo(event.getX(),event.getY()); component.repaint(); // force refresh } // Do-nothing methods public void mouseReleased(MouseEvent event) {} public void mouseClicked(MouseEvent event) {} public void mouseEntered(MouseEvent event) {} public void mouseExited(MouseEvent event) {} Continued…

File RectangleMover.java // Registra il listener MouseListener listener = new MousePressListener(); component.addMouseListener(listener); // Crea e disponi il frame JFrame frame = new JFrame(); frame.add(component); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } private static final int FRAME_WIDTH = 300; private static final int FRAME_HEIGHT = 400;

Domande Cosa succederebbe se omettessimo la chiamata a repaint nel listener? Perchè nella classe MousePressListener dobbiamo definire tutti i metodi?

Risposte Non avremmo l’effetto dell’animazione perché il rettangolo verrebbe ridisegnato solo in occasione di eventi del frame. Perché implementa l’interfaccia MouseListener interface, che ha i cinque metodi