Programmazione ad Eventi

Documenti analoghi
Gestione di eventi ed interfacce utente grafiche

Interfacce e Polimorfismo

Interfacce grafiche utente

La nostra finestra dovrebbe essere come mostra la figura: Diamo innanzitutto un occhiata alle componenti principali di input/output:

I Layout Manager di java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni

INTERFACCE GRAFICHE IN JAVA CON SWING DISPENSE

Raffaella Brighi, a.a. 2005/06. Eventi e listener. Corso di Laboratorio II. A.A

Applicazioni grafiche

Programmazione Java: Interfacce grafiche (GUI)

Alessandro De Luca. Lezione, 13 maggio 2015

GUI e java swing. Elmenti della GUI. Eventi e listener contenitori componenti layout manager. caratteristiche speciali

L interfaccia grafica con Java

Sviluppo di Interfacce Grafiche in Java

Esercizi. Esercizio P9.16. File ExP9_16.java. Anno Accademico 2003/04. Docente modulo 2: Barbara Masucci

Paradigmi di programmazione (sperimentazioni)

Interfacce. Un interfaccia Java è una collezione di metodi astratti (e di costanti) Un metodo astratto è un metodo non implementato

Java GUI. Swing Java

Programmazione in Java e gestione della grafica. Lezione 21

L Abstract Windowing Toolkit. Le GUI in Java. Il Frame. Cenni sull ereditarietà. Gianpaolo Cugola - Sistemi Informativi in Rete

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

Gestione degli eventi in Java

Programmazione in rete e laboratorio

L interfaccia grafica in Java

interfacce ed eventi intercettare il mouse ed altri eventi

Eventi di azione. // con interfaccia per eventi di azione

Le basi della grafica in Java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni

Interazioni col mondo: eventi

Progettazione e Sviluppo di Interfacce Grafiche con Java Swing

Classi astratte. Master in Web Technology e Security luglio - settembre Interfacce

Interfacce grafiche. Una GUI (Graphic User Interface) contiene vari componenti: bottoni, etichette, immagini...

Swing. Swing 1. Java e la grafica Java permette di realizzare agevolmente applicazioni grafiche Package java.awt

Corso sul linguaggio Java

Corso sul linguaggio Java

Introduzione al package grafico Swing

Evento sulla modifica delle caselle di testo

maggio 2004 Stefano Sanna - gerda@crs4.it

Introduzione (Swing vs AWT)

Marco Faella Elementi di programmazione di interfacce Grafiche. Il pattern OBSERVER.

ESERCITAZIONI SU Java

8. GUI : Graphics User Interface

Thread e Concorrenza in Java Swing

BorderLayout. 1 Gestori di Layout (guida visuale)

Sviluppo di Interfacce Grafiche in Java. Concetti di Base ed Esempi.

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo

Interfacce e polimorfismo

Gestione dell interattività: gli eventi

Threads e Concorrenza in Java Swing

L applicazione di MVC alla simulazione di ascensore I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE II 1

Esercitazione del Corso di Informatica Grafica. Strumenti per scrivere applicazioni in JAVA

Ereditarietà e classi astratte

Programmazione in Java e gestione della grafica. Lezione 19

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

INTERFACCE GRAFICHE IN JAVA CON SWING DISPENSE

24 - Possibili approfondimenti

Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

COGNOME.NOME. Matricola

Grafico della parabola

APPLICAZIONI & APPLET

Principi di base della programmazione di interfacce grafiche in Java

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

! Programmazione strutturata. ! OO: TDA, scambio messaggi, eredità, polimorfismo, OO in Java. ! Rassegna API. ! Documentazione Javadoc delle API

Semplici applicazioni grafiche in Java

Application VS Applet

GUI e java swing. Templates per GUI degli IDE. Gli IDE forniscono Template per generare interfacce grafiche.

APPLICAZIONI & APPLET

PROGRAMMAZIONE GRAFICA

component - container - layout

Corso Eclipse. Prerequisiti. 3 Window Builder

Graphical User Interfaces in Java

JAVA Interfacce grafiche per Applicazioni ed Applet

AWT: Abstract Window Toolkit

TECNOLOGIE APPLICAZIONI WEB Linguaggio Java: Le Applet

Grafica swing in Java

23 - Graphical User Interface GUI (Cenni)

Graphic User Interface (GUI) Model / View / Controller. Fondamenti di Informatica T2 Modulo 2. Università di Bologna A.A.

Laboratorio di IUM. Lezione 3. La gestione degli eventi. Di Blasi Gianpiero - D.M.I. - Università di Catania

Java Interfaccia Grafica

Finestra.java. static String nomicolonne[] = {"ind.","cognome","nome","telefono"," "}; //nomi delle colonne della tabella

Applet. Applet: il termine identifica piccole applicazioni da eseguirsi all interno di un browser.

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

La nostra interfaccia avrà l aspetto seguente:

Esercizio 1: Gara di MotoGP

LE TABELLE. Le liste permettono di avere una sequenza di righe In alcune applicazioni è però necessario visualizzare le informazioni anche in colonne

UN CLONE IN CLIKE C-LIKE DI SEGUIVISIONE

Progetto di Applicazioni Software

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Esercitazione sui Design Pattern

Programmazione Orientata agli Oggetti in Linguaggio Java

Applet e servlet finanziarie

Modulo 2: Strutture fondamentali della programmazione Java

Introduzione alla Programmazione in Java attraverso un esempio commentato

Tutorial SWING-AWT: Il Layout Manager GridBagLayout Di Michele de Nittis

Le tre operazioni sono identiche; il programmatore può scegliere il costruttore di volta in volta più comodo.

Scope e visibilità per classi

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB.

Il codice generato automaticamente da NetBeans

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Modifica Pagina Web. Pulsante LogOut: cliccare per uscire dall'ambiente di amministrazione

Chiamata delle funzioni JavaScript da un applet

Lena Cota Guido Corso di Informatica - II livello. Excel 2003 Formule. Imparare a usare le formule con la pratica

Transcript:

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 Listener: 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: public interface ActionListener { void actionperformed(actionevent event); } Dobbiamo fornire una classe il cui metodo actionperformed contiene le istruzioni da eseguire quando il pulsante viene premuto 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: ActionListener listener = new ClickListener(); button.addactionlistener(listener); addactionlistener(): un metodo di JButton 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 import java.awt.event.actionlistener; import javax.swing.jbutton; import javax.swing.jframe; /** Come installare un ActionListener. */ public class ClickApp { public static void main(string[] args) { JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); frame.add(button); Continua

File ClickTester.java } ActionListener listener = new ActionListener() { public void ActionPerformed() { System.out.println( I was clicked ); } } frame.setsize(frame_width, FRAME_HEIGHT); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true); } private static final int FRAME_WIDTH = 100; private static final int FRAME_HEIGHT = 60; Continua

File ClickListener.java Output:

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 JButton button = new JButton("Add Interest"); Una JLabel per visualizzare il saldo: 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 JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); Aggiungiamo prima il pulsante, poi l etichetta Vengono disposti da sinistra a destra, in ordine 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 final int FIELD_WIDTH = 10; // numero di caratteri final JTextField ratefield = new JTextField(FIELD_WIDTH); Associamo ad ogni campo di testo una JLabel per chiarire il senso dell input 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 class AddInterestListener implements ActionListener { public void actionperformed(actionevent event) { double rate = Double.parseDouble(rateField.getText());... } } Registriamo il listener sia sul pulsante sia sul campo testo

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: final int ROWS = 10; final int COLUMNS = 30; JTextArea textarea = new JTextArea(ROWS, COLUMNS); settext: definisce il contenuto (JTextArea, e JTextField) append: aggiunti testo alla fine dell area Continua

Aree di testo newline per separare le linee di testo textarea.append(account.getbalance() + "\n"); Aree di testo di sola lettura 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: panel.add(component, BorderLayout.NORTH); Espande ciascuna componente fino a riempire l are assegnata se non si vuole questo effetto è necessario includere la componente in un ulteriore pannello

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

Disegno di forme geometriche JComponent La classe che definisce contenitori generici, al cui interno includiamo forme geometriche Possiamo definire nuovi JComponent class ShapeComponent extends JComponent {... }

Disegno di forme geometriche paintcomponent metodo che produce il disegno invocato (automaticamente) tutte le volte che il componente per il quale è definito viene ridisegnato

Disegno di forme geometriche paintcomponent(graphics g) g contesto grafico Graphics classe che permette di manipolare lo stato del contesto grafico class ShapeComponent extends JComponent { public void paintcomponent(graphics g) { // Converti in Graphics2D Graphics2D g2 = (Graphics2D) g;... } }

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)

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 7. Cosa succederebbe se omettessimo la chiamata a repaint nel listener? 8. Perchè nella classe MousePressListener dobbiamo definire tutti i metodi?

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