Swing e la programmazione a 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.
Informatica Recupero debito quarto anno Terzo incontro.
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.
CONOSCIAMO IL WINDOWS '95.
Corsi per il personale Bicocca-Insubria
Java Enterprise Edition (JEE)
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Università degli Studi di Modena e Reggio Emilia
Il linguaggio java Esercitazioni del corso di Sistemi Informativi
GUI Graphical Users Interfaces
Elementi di programmazione grafica
Elementi di programmazione grafica
Programmazione ad Eventi
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 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Swing e la programmazione a eventi
1 Anatomia di una pagina Un insieme di pagine web hanno generalmente una parte invariante (o poco): header, navigazione, footer una parte variabile: contenuti.
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.
Più movimento alle classi
Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 81 Gestione dei colori La gestione dei colori in AWT consente di specificare un qualunque.
Gestione dei Progetti Software 2 (a.a. 204/05) - Lezione 4 1 Il package java.awt Gestione dellI/O orientato alla grafica: le finestre Sviluppo di interfacce.
Progetto di applicazioni grafiche. Disegno di forme complesse Prassi : un classe per ciascuna forma Progetta la forma individuando le componenti base.
Windows Sistema operativo con interfaccia grafica per PC IBM compatibili (varie versioni dal 95) La gestione dei file viene fatta secondo le modalità.
UNIVERSITÀ DEGLI STUDI DI MODENA E REGGIO EMILIA Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Scienze dellInformazione Applicazione.
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.
DBMS ( Database Management System)
EXCEL FORMATTAZIONE DATI.
Introduzione alla modellazione di sistemi interattivi
Un report è in grado di personalizzare la stampa delle informazioni rispetto alla stampa di una tabella, di un recordset o di una maschera. I report possono.
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.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
USO DEL COMPUTER E GESTIONE DEI FILE
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)
Introduzione. Introduzione Un’applet Java: Una applet ("applicazioncina") è una applicazione non autonoma, ma pensata per far parte di una pagina Internet.
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.
Programmazione ad oggetti
OOP per la simulazione di sistemi reali. di Gianfranco Gallizia.
Programmazione ad oggetti
Microsoft Access Maschere (II).
Lezione 11 Riccardo Sama' Copyright  Riccardo Sama' Excel.
Interfacce grafiche Capitolo 27 marzo 2004 Interfacce grafiche.
Timer Animazioni.
Tag FRAMESET. I frame sono un particolare tipo di struttura HTML, che consente di suddividere la finestra del browser in diversi riquadri distinti. Un'insieme.
Capitolo 12 Thread Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Tag IMG Per inserire un'immagine in una pagina HTML basta inserire il tag: ; questo tag non ha bisogno di chiusura. Affinché l'immagine venga visualizzata.
Java terzo contatto Swing Java.
La gestione degli eventi
Esercitazione  obiettivo: scrivere una applicazione per il gioco “Centra Bersaglio”  metodo individuazione e definizione delle classi necessarie.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Sistemi operativi di rete Ing. A. Stile – Ing. L. Marchesano – 1/18.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Cloud Tecno V. Percorso didattico per l’apprendimento di Microsoft Access 4 - Le maschere.
Introduzione alle Classi e agli Oggetti in Java 1.
Autoresizing e autolayout. Posizionare gli elementi All’interno dello storyboard, gli elementi possono essere posizionati trascinandoli nella posizione.
Transcript della presentazione:

Swing e la programmazione a eventi Prova Finale – Ingegneria del Software Davide Mazza davide.mazza@polimi.it http://home.dei.polimi.it/mazza

Lo stile basato su eventi I componenti interagiscono attraverso l’invio di messaggi broadcast o multicast “Attenzione! C’è una nuova notizia di Politica” “Sono interessato alle notizie di Sport” Ogni componente notifica un cambiamento nel proprio stato o in quello dell’ambiente inviando un messaggio In tal caso agisce da “generatore dell’evento” Tutti i componenti interessati all’evento descritto da tale messaggio ne ricevono copia In tal caso agiscono da “ascoltatori dell’evento” In generale, il generatore dell’evento non conosce né il numero né l’identità degli ascoltatori

Caratteristiche generali Con il paradigma a eventi L’applicazione è puramente “reattiva” Non è possibile identificare staticamente un flusso di controllo unitario Il programma principale si limita a inizializzare l’applicazione, istanziando gli osservatori e associandovi gli opportuni handler Occorrenza dell’evento A Occorrenza dell’evento B Realtà Applicazione Osservatori Notifica dell’evento A Notifica dell’evento B Ascoltatore evento A Ascoltatore evento A Ascoltatore evento B listeners

Vantaggi Utili per sistemi altamente dinamici ed evolutivi, in cui nuovi moduli si possono aggiungere o possono essere eliminati Per comunicare tra di loro, i moduli non devono conoscere le rispettive identità come invece accade in Java nomeModulo.nomeServizio (parametri) Si parla più in generale di paradigma di progettazione "publish and subscribe" moduli che generano eventi ("publish") moduli che sottoscrivono l'interesse ad essere notificati dell'occorrenza di certi eventi ("subscribe")

In pratica subscribe y y x subscribe z subscribe x Gestore degli eventi subscribe z subscribe x

Modello a eventi in Java Un’applicazione può essere costruita come componenti che interagiscono attraverso eventi Qui noi vediamo il package javax.swing libreria che fornisce le classi che consentono la progettazione delle interfacce utente secondo lo stile ad eventi

Swing

UI e GUI UI: User Interface GUI: Graphical User Interface L'interfaccia utente costituisce il mezzo con il quale l'utente interagisce con l'applicazione GUI: Graphical User Interface Fondamentale per l'usabilità del software Come si progetta?

Progettazione Separare GUI e parte funzionale La GUI si preoccupa di interagire con l'utente visualizzare accettare input La parte funzionale contiene la logica applicativa Vantaggi GUI modificabile senza toccare la parte funzionale e viceversa La parte funzionale può essere testata automaticamente senza interagire con l’interfaccia grafica Diverse strategie "look&feel" per la stessa applicazione Spesso le modifiche si incentrano sulla GUI al fine di migliorare l'usabilità

AWT e Swing Abstract Windowing Toolkit (AWT) Swing Sono un residuo di precedenti versioni di JAVA fornisce ancora alcune importanti componenti al funzionamento e creazione di elementi di interfaccia Swing Costruite sopra AWT Consentono di realizzare applicazioni con un “look and feel” più aggiornato e elegante Più semplici da usare rispetto alle librerie AWT Il nome di tutti le classi Swing inizia con J (Es. JButton, Jframe, ecc) Per motivi di compatibilità è bene non includere componenti Swing ed AWT in una stessa interfaccia

Model-View-Controller Swing si basa su un “paradigma” di progettazione che si incontra anche in altri campi: Un componente ha un suo “modello logico” Un componente ha un suo “aspetto visuale” Un componente ha “comportamenti” che consentono la sua interazione con il resto dell’applicazione Esempio: JButton Model: Premuto/Rilasciato (variabile booleana) View: dipende dal look&feel Controller: azioni associate agli eventi del pulsante

Un’interfaccia Swing Tre elementi fondamentali Contenitori Finestre, Panelli Elementi Interattivi e visuali Pulsanti, Menù, Caselle di teso Eventi Pulsante premuto, Focus, resize

Components e Container Tutti gli elementi che hanno una rappresentazioni grafica sono dei Component Sono sotto classi di java.awt.Component Esempi: JLabel, JTextArea, JButton Sia i contenitori che gli elementi interattivi sono Component I contenitori sono implementati dalla classe java.awt.Container Sotto classe di java.awt.Component Esempi: JFrame, JPanel

Container I Container possono contenere un insieme di Component Dato che tutti i Container sono dei Component posso avere un meccanismo a scatole cinesi Un container può contenere altri Container Esempio: una finestra contiene diversi pannelli, e i pannelli contengono vari pulsanti Non tutti i Component sono Container! Container.add(Component c) Container.add(Component c, parametri …) I parametri specificano come il componente verrà posizionato nel contenitore

Frame Un frame Definisce l’intelaiatura dell’interfaccia Fornisce un rettangolo, “decorato” alla maniera delle finestre cui siamo abituati E’ un oggetto COMPLESSO! Riceve Eventi come close, resize, riduzione ad icona, ecc

JFrame java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame Come in tutta la programmazione ad oggetti occorre conoscere la “gerarchia” entro la quale si colloca JFrame Per conoscere la “derivazione” di ogni oggetto delle librerie GUI di Swing si deve fare ricorso alla documentazione in linea di Java http://java.sun.com/j2se/1.5/docs/api/

Scorrendo la gerarchia Component “A component is an object having a graphical representation that can be displayed on the screen and that can interact with the user. Examples of components are the buttons, checkboxes, and scrollbars of a typical graphical user interface” Component è quindi una classe molto generale e definisce un sacco di metodi Container Un Component con la proprietà di essere abilitato a contenere altri Component Prevede metodi di tipo “add” per aggiungere componenti Prevede anche metodi per rappresentare il contenitore e i suoi contenuti e per aggiornarne l’immagine

Scorrendo la gerarchia Window È un particolare contenitore che può apparire sullo schermo come entità propria, ma non ha bordi, barre e controlli Possiede metodi per mostrare la finestra, nascondere la finestra, posizionare la finestra e aggiustare l’ordine di comparizione relativamente ad altre finestre Frame Si tratta di Window con bordi e barra del titolo, oltre alle caratteristiche solite di un’interfaccia (minimizzazione, iconizzazione, chiusura, resizing) JFrame È un Frame AWT a cui SWING aggiunge una serie di metodi per ridefinire i dettagli grafici. Ad esempio l metodo setSize(int l, int h) permette di determinare le dimensioni del Frame Il metodo setLocation(int x, int y) consente di definire le coordinate del pixel in alto a sinistra del frame nel riferimento dello schermo

Cosa possiamo fare con un JFrame? Aggiungere un titolo usando il costruttore ereditato Possiamo aggiungere componenti nel suo pannello principale: frame.getContentPane().add(label) frame.add(label) Settare le dimensioni delle finestra Associare un azione all’evento di chiusura della finestra Mostrare la finestra all’utente

HelloWorldSwing import javax.swing.*; public class HelloWorld extends JFrame{ public HelloWorld (){ super("HelloWorld!"); setSize(200, 100); setDefaultCloseOperation(EXIT_ON_CLOSE); add(new JLabel("Hello World!")); setVisible(true); } public static void main(String[] args) { new HelloWorld();

Aggiungiamo componenti Dobbiamo sapere: Da dove prendere i componenti? Una lista/descrizione delle librerie disponibili Come costruirli e personalizzarli? Costruttori e modificatori Come usarli? Quali eventi sono in grado di raccogliere e quali i listener necessari Come disporli sui frame che costituiscono la nostra applicazione? Layout manager

Container Top-level container General-purpose container JApplet JDialog JFrame JScrollPane JSplitPane JTabbedPane JPanel

Container Special-purpose container JInternalFrame JLayeredPane JToolBar Permette di semplificare l’attivazione di determinate funzioni per mezzo di semplici pulsanti Permette di inserire frame dentro altri frame Permette di inserire componenti a vari livelli di profondità

Controlli di base JButtons JComboBox JList JMenu JTextField JSlider Include buttons, radioButtons, checkbox, MenuItem, ToggleButton JTextField JSlider Include JPasswordField, JTextArea

Visualizzatori di informazioni non editabili JLabel JProgressBar Jcomponent.setToolTipText(String) Può includere immagini e/o testo

Visualizzatori di informazioni formattate editabili JColorChooser JFileChooser JTable JTextComponent JTree JTextField, JPasswordField, JTextArea, JEditorPane, JTextPane

Layout Java gestisce la disposizione dei componenti dentro i Container mediante oggetti che si chiamano LayoutManager Incapsulano gli algoritmi per il posizionamento delle componenti di una GUI Il LayoutManager mantiene l’algoritmo separato in una classe a parte È un’interfaccia che descrive come un componente deve comunicare con il suo LayoutManager Esiste un’ampia collezione di LayoutManager, ma se si vuole si può creare il proprio Noi vediamo solo i LayoutManager più comuni: FlowLayout, BorderLayout, GridLayout, CardLayout e GridBagLayout L’associazione avviene tramite il metodo setLayout() di cui è provvista la classe Container (e quindi tutte le sue sottoclassi) p.setLayout(new BorderLayout());

FlowLayout E’ il più semplice. La sua strategia è: public static void main(String[] args) { JFrame frame = new JFrame("Flow"); frame.setLayout(new FlowLayout()); frame.add(new JButton("Button1")); frame.add(new JButton("Button2")); frame.add(new JButton("Button3")); frame.add(new JButton("Button4")); frame.add(new JButton("Button5")); frame.pack(); frame.setVisible(true); } E’ il più semplice. La sua strategia è: Rispettare la dimensione di tutti i componenti Disporre i componenti in orizzontale finché non viene riempita tutta una riga, altrimenti iniziare su una nuova riga Se non c’è spazio i componenti non vengono visualizzati E’ possibile allineare i componenti a sinistra, destra o al centro E’ possibile specificare la distanza verticale e orizzontale

BorderLayout Definisce 5 aree logiche: NORTH, SOUTH, CENTER, EAST e WEST Richiede la dimensione preferita del componente (altezza e larghezza) Se il componente è NORTH o SOUTH setta l’altezza al valore preferito e la larghezza in modo da occupare tutto lo spazio orizzontale Se il componente è EAST o WEST setta la larghezza al valore preferito e l’altezza in modo da occupare tutto lo spazio verticale restante Se il componente è CENTER setta l’altezza e la larghezza in modo da occupare tutto lo spazio centrale restante Quindi Le posizioni NORTH e SOUTH servono quando vogliare fissare l’altezza di un componente al valore preferito Le posizioni EAST e WEST servono quando vogliamo fissare la larghezza di un componente al valore preferito La parte CENTER è quella che si espande

Esempio public static void main(String[] args) { JFrame frame = new JFrame("Border"); frame.setLayout(new BorderLayout()); frame.add(new JButton("North"), BorderLayout.NORTH); frame.add(new JButton("South"), BorderLayout.SOUTH); frame.add(new JButton("Center"), BorderLayout.CENTER); frame.add(new JButton("East"), BorderLayout.EAST); frame.add(new JButton("West"), BorderLayout.WEST); frame.pack(); frame.setVisible(true); }

GridLayout Dispone i componenti su una griglia public static void main(String[] args) { JFrame frame = new JFrame("Grid"); frame.setLayout(new GridLayout(3,4)); for (int x=0; x<12; x++) frame.add(new JButton(""+x)); frame.pack(); frame.setVisible(true); }

Stratificazione public static void main(String[] args) { JPanel panel_flow=new JPanel(new FlowLayout(FlowLayout.CENTER,20,20)); panel_flow.setBorder(BorderFactory.createTitledBorder("Flow Layout")); panel_flow.add(new JLabel("JLabel")); panel_flow.add(new JTextField("JTextField")); panel_flow.add(new JButton("JButton")); JPanel panel_grid=new JPanel(new GridLayout(3,1)); panel_grid.setBorder(BorderFactory.createTitledBorder("Grid Layout")); panel_grid.add(new JButton("JButton_1")); panel_grid.add(new JButton("JButton_2")); panel_grid.add(panel_flow); JFrame f = new JFrame("Example"); f.add(panel_grid); f.pack(); f.setVisible(true); }

Layout di Default Nel JPanel il layout di default è: FlowLayout Nel JFrame il layout di default è: BorderLayout

Eventi L’interazione tra gli elementi dell’interfaccia e la logica applicativa è gestita tramite eventi Gli EventListener sono interfacce definite per catturare e processare tipi di eventi particolari Un listener deve Essere associato al componente Essere informato quando il componente genera un evento del tipo richiesto Rispondere facendo qualcosa di appropriato

EventHandler Devono avere tre pezzi di codice Dichiarazione Estendono o implementano listener esistenti public class MyClass implements ActionListener { Associazione tra handler (ovvero listener) e istanza someComponent.addActionListener(instanceOfMyClass); Definizione del codice che implementa i metodi dell’interfaccia listener public void actionPerformed(ActionEvent e) { ...

Un primo esempio public class Demo extends JFrame implements ActionListener { JButton button = new JButton("Click me!"); public Demo() { button.addActionListener(this); getContentPane().add(button); pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { button.setBackground(Color.RED); public static void main(String[] args) { new Demo();

Eventi e Listener FocusListener FocusEvent focus WindowListener WindowEvent cambiamenti nella finestra ActionListener ActionEvent bottoni, menu,... AdjustmentListener AdjustmentEvent scrollbar TextListener TextEvent input di testo ItemListener ItemEvent Selezione elem KeyListener KeyEvent Keyboard MouseListener, MouseMotionListener MouseEvent Mouse handler Evento Categoria

Swing e Thread Nelle Swing, la gestione degli eventi e il ridisegno delle finestre e dei componenti grafici è affidata ad un unico thread Dispatching Thread Perché un unico thread? Perché le Swing non sono thread safe! L’accesso ad un oggetto da parte di più thread può causare problemi! Dispatching Thread: Viene eseguito in background Processa gli elementi presenti nella coda degli eventi grafici Anche il ri-disegno dei componenti è un evento (paint)

Esempio Completo public class Calcolatrice extends JFrame { private JButton somma; private JTextField num1; private JTextField num2; private JTextField tot; public Calcolatrice(){ […] } //Gestione Evento public static void main(String[] args) { new Calcolatrice();

Esempio Completo - Costruttore public Calcolatrice(){ super("Semplice Calcolatrice"); setDefaultCloseOperation(EXIT_ON_CLOSE); somma = new JButton("somma"); num1 = new JTextField("1",5); num2 = new JTextField("1",5); tot = new JTextField("0",5); somma.addActionListener(new AzioneSomma()); setLayout(new FlowLayout()); add(num1); add(num2); add(somma); add(tot); pack(); setVisible(true); }

Esempio Completo – Gestore dell’Evento public class Calcolatrice extends JFrame { private JButton somma; private JTextField num1; private JTextField num2; private JTextField tot; public Calcolatrice(){ } //Gestione Evento private class AzioneSomma implements ActionListener{ public void actionPerformed(ActionEvent arg0) { int n1= Integer.parseInt(num1.getText()); int n2= Integer.parseInt(num2.getText()); tot.setText("" + (n1+n2));

Link utili Swing Tutorial: http://download.oracle.com/javase/tutorial/uiswing/index.html Java Api: http://java.sun.com/javase/6/docs/api/