Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione.

Slides:



Advertisements
Presentazioni simili
Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) dopo ciascuna istruzione del main: public class Up extends Object { public.
Advertisements

1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Java e le interfacce grafiche
Unit à E4 Applet. Obiettivi Saper progettare e realizzare Applet Java allinterno di pagine HTML Comprendere le interazioni tra il browser e lapplet Saper.
Interfacce Java.
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.
WSDL (Web Services Description Language) Laurea Magistrale in Informatica Reti 2 (2006/07) dott. Federico Paoloni
Capitolo 2 Nozioni fondamentali su Java Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill.
Capitolo 4 Classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
JPA Overview della tecnologia. Java Persistence Architecture Definita nella JSR-220 EJB 3.0 ( Tentativo di unificare EJB2.1 con.
Alcune Classi Standard Object, Vettori. Esercizio dellultima volta Superclasse Persona Sottoclasse Libro.
Esercizio 2. Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni di classe.
GUI Graphical Users Interfaces
E Windows SharePoint Services 2.0 Ivan Renesto Overview how to use Windows SharePoint Services.
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.
Model – View - Controller
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
J0 1 Marco Ronchetti Java Threads & Sincronizzazione.
Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.
Richiami di Java Multithreading. Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); …
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Swing e la programmazione a eventi
Swing e la programmazione a eventi
1 Ultima Lezione del Corso di Fondamenti di Informatica 1 a.a – 06 Ma 29-Nov-2005.
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
JAVA C import java.util.*; #include <stdio.h>
Introduzione a JFC/Swing
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.
1 Implementazione di Linguaggi 2 PARTE 6 Implementazione di Linguaggi 2 PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
Packages. Package: insieme di classi e interfacce in relazione Per formare un package basta inserire la direttiva come prima istruzione nel file sorgente.
Callbacks. Scelta delle classi di un progetto Criteri di coesione e accoppiamento Interfacce e subtype polimorfismo Tipi, sottotipi e conversioni di tipo.
Streams e Input/output
Gestione File System e I/O in Windows 2000 Implementazione del File System FAT-12, FAT-16, FAT-32 NTFS API relative al File System Gestione dei dispositivi.
Programmazione distribuita in Java
A.N 991 Client server SQL DBMS TP monitors componenti middleware CORBA Web server OTM HTML Protocolli Sicurezza dati istruzioni funzioni oggetti interfacce.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Microsoft Access Maschere.
Fondamenti di Informatica Corsi di Laurea in Ingegneria Gestionale Canale AL ESERCITAZIONE 4 ARGOMENTI: STRINGHE DI CARATTERI.
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
Sviluppo di una Xlet per la TV digitale terrestre Vademecum della regione marche 2006 Ventura Luca.
Moduli o Form I Moduli permettono all'utente di immettere informazioni...
Fondamenti di Informatica Corsi di Laurea in Ingegneria Gestionale Canale AL ESERCITAZIONE 6 ARGOMENTI: LAVORARE CON CLASSI METODI DELLISTANZA, COSTRUTTORI.
Ese 2 (del 31 Marzo 2004). Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni.
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
VB.NET Sviluppo Applicazioni Desktop
Test con JUnit. zJUnit è un ambiente di test per programmi Java ySviluppato da Kent Beck É possibile usare JUnit allinterno di Eclipse per eseguire i.
Project Review Novembrer 17th, Project Review Agenda: Project goals User stories – use cases – scenarios Project plan summary Status as of November.
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Collection & Generics in Java
Fondamenti di informatica T-A Esercitazione 7 : Collezioni AA 2012/2013 Tutor : Domenico Di Carlo.
Aggiungiamo Elementi al Frame Per poter posizionare un elemento all'interno di un frame dobbiamo utilizzare il "layout manager". Ogni contenitore (Container)
JDBC Java DataBase Connectivity SISTEMI ITIS B. CASTELLI Anno Scolastico
Java gestione eventi introduzione. La gestione degli eventi Ci sono 3 oggetti interessati alla g. d. e.: L’oggetto interessato (event source) ad esempio.
Interfacce grafiche Capitolo 27 marzo 2004 Interfacce grafiche.
Timer Animazioni.
Esercizi.
Java e le interfacce grafiche
Composizioni di classi
DOM Document Object Model.
Paradigma di programmazione event-driven
Transcript della presentazione:

Gerarchie di Tipi

Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Notazione UML RelazioneSimboloSignificato Ereditarietàis-a Implementazioneis-a Aggregazionehas a Dipendenzausa

Una struttura universitaria Il personale è strutturato in Personale Docente: Faculty Personale Tecnico Amministrativo: Staff

Una struttura universitaria Introduciamo una terza categoria che descrive le due tipologie di personale UnivEmployee Definisce le caratteristiche di struttura e comportamento comuni a tutto il personale Intesa non per creare istanze proprie definiamo abstract per realizzare queste scelte di progetto

Una struttura universitaria UnivEmployee FacultyStaff

University Employees A tutto il personale viene garantito luso di posta elettronica Rappresentiamo mediante un metodo Includiamo il metodo in UnivEmployee così che venga ereditato dalle due classi derivate /** * manda un messaggio alloggetto su cui è invocato */ public void mailTo(String msg);

public abstract class UnivEmployee { private List mailbox = new ArrayList (); public void mailTo(String msg) { mailbox.add(msg); }... } public class Faculty extends UnivEmployee {... } public class Staff extends UnivEmployee {... } University Employees

Laccesso alla posta elettronica è una proprietà generale Possiamo concettualizzare questa proprietà una interfaccia University Employees interface Int { public void mailTo(String msg); }

University Employees con UnivEmployee FacultyStaff Int

abstract class UnivEmployee implements Int {... public void mailTo(String msg) {... } } class Faculty extends UnivEmployee {... } class Staff extends UnivEmployee {... } University Employees con

University Employees Al personale docente viene inoltre garantita la possibilità di gestire una propria pagina web Definito solo per la classe Faculty /** * restituisce la URL associata alloggetto */ public Url browse();

University Employees … on the web Anche qui, possiamo generalizzare introducendo una nuova interfaccia interface WebInt { public Url browse(); }

UnivEmployee FacultyStaff Int WebInt University Employees … on the web

public abstract class UnivEmployee implements Int {... public void mailTo(String msg) {... } } public class Faculty extends UnivEmployee implements WebInt { public Url browse() {... }... } public class Staff extends UnivEmployee {... } University Employees … on the web

Gerarchie di tipi Ogni classe può implementare più interfacce estendere al più una classe I due meccanismi si possono combinare

Gerarchie di tipi Uno schema ricorrente SuperClasse Classe Interfaccia Permette di utilizzare Classe come SuperClasse e Interfaccia

University Employees … on the web Possiamo dare struttura alla composizione di interfacce Estensione di interfacce no vincoli: possiamo estendere più di una interfaccia interfaccia che estende è sottotipo di tutte le interfacce che vengono estese interface Online extends Int,WebInt { }

UnivEmployee FacultyStaff Int WebInt University Employees … on-line OnLine

public abstract class UnivEmployee implements Int {... public void mailTo(String msg) {... } } public class Faculty extends UnivEmployee implements OnLine { public Url browse() {... }... } public class Staff extends UnivEmployee {... } University Employees … on line

Corsi Il personale docente insegna uno o più corsi allinterno dei corsi di laurea Rappresentiamo nei diagrammi con una nuova relazione tra classi associazione

University Employees UnivEmployee FacultyStaff Int WebInt Course 1..* OnLine

public abstract class UnivEmployee implements Int {... public void mailTo(String msg) {... } } public class Faculty extends UnivEmployee implements OnLine { public Url browse() {... }... private ArrayList courses;... } public class Staff extends UnivEmployee {... } University Employees

I corsi vengono gestiti dal personale tecnico amministrativo per gli aspetti relativi a iscrizione, liste di esami … La classe Staff dipende quindi dalla classe Course

University Employees UnivEmployee FacultyStaff Int WebInt Course 1..* OnLine

public abstract class UnivEmployee implements Int {... public void mailTo(String msg) {... } } public class Faculty extends UnivEmployee implements Online { public Url browse() {... }... private ArrayList courses;... } public class Staff extends UnivEmployee { public void admin(Course c) {... }... } University Employees

Corsi … on-line Possiamo sfruttare la struttura in più che abbiamo ottenuto dallintroduzione delle interfacce per rappresentare ulteriori funzionalità Ad esempio, i corsi possono essere dotati di un sito web e di un indirizzo di posta elettronica

Corsi … on-line UnivEmployee FacultyStaff Int WebInt Course 1..* OnLine

Metodologie di progetto basate su estensione e composizione di classi e interfacce Progetto di interfacce grafiche

Eventi e Listeners La sorgente di un evento ispeziona la lista dei suoi listeners (registrati) seleziona tutti i listeners il cui tipo corrisponde al tipo dellevento. su ciascuno dei listeners selezionati, invoca il metodo associato allevento passandogli levent object associato allevento

Listeners – (alcuni) metodi ActionListenervoid actionPerformed(ActionEvent) WindowListener void windowActivated(WindowEvent) void windowClosed(WindowEvent) ListSelectionListenervoid valueChanged(ListSelectionEvent) KeyListener void keyPressed(KeyEvent) void keyReleased(KeyEvent) void keyTyped(KeyEvent) MouseMotionListener void mouseMoved(MouseMotionEvent) void mouseDrag(MouseMotionEvent MouseListenervoid MouseClicked(MouseEvent) void mouseEntered(MouseEvent)

Listeners e Adapters Listeners : interfacce Adapters: classi (astratte) che implementano i listeners fornendo implementazioni default per i metodi dichiarati dai listeners La nomenclatura aiuta: XEvent : la classe associata allevento X XListener : linterfaccia che i listenerers dellevento X devono implementare XAdapter : la classe astratta che implementa XListener con metodi default:

: EventListener MouseMotionListener WindowListenerKeyListener ListSelectionListener MouseListenerActionListener Listeners

: EventListener MouseMotionListener WindowListenerKeyListener ListSelectionListener MouseListenerActionListener KeyAdapterMouseAdapterWindowAdapter Listeners e Adapters

Definizione di Listeners Implementiamo il Listener Estendiamo lAdapter class MyXAdapter extends XAdapter { // sovrascrive (alcuni de) i metodi definiti da XAdapter } class MyXListener implements XListener { // metodi definiti da XListener }

Registrazione di Listeners Ogni event source ha un metodo per registrare un corrispondente listener public void addXListener(XListener listener)

Esempio: ClickCounter 4 clickReset

Esempio: ClickCounter Gestione eventi: prima alternativa Il frame gestisce entrambi i pulsanti JFrame ClickCounter ActionListener

Esempio: ClickCounter JFrame ClickCounter ActionListener public class ClickCount extends JFrame implements ActionListener { int count = 0; JLabel clicks = new JLabel ("Total clicks = 0"); JButton b = new JButton ("click"); JButton r = new JButton ("reset");... public ClickCount() {... b.addActionListener(this); r.addActionListener(this); }... public void actionPerformed( ActionEvent e ) { if (e.getSource() == b) count++; else if (e.getSource() == r) count = 0; clicks.setText("Total clicks = " + count); }

Esempio: ClickCounter Gestione eventi: seconda alternativa I pulsanti gestiscono gli eventi autonomamente JFrame ClickCounter ActionListener 2

Esempio: ClickCounter public class ClickCount extends JFrame {... public ClickCount() {... b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { count++; clicks.setText("Total clicks = " + count); }}); r.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { count = 0; clicks.setText("Total clicks = " + count); }}); }... }

Domande Come disponiamo due pulsanti allineati sul lato inferiore di un frame? Come disponiamo tre pulsanti uno sopra laltro?

Risposte Prima le aggiungiamo ad un pannello (con FlowLayout ) e poi aggiungiamo il pannello allare sud del frame. Li disponiamo dentro un panello con GridLayout contenente tre righe ed una colonna

Esempio – EventFrame Una finestra che cattura e traccia un insieme di eventi del mouse

EventFrame – costruttore import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; /** EventFrame: traccia eventi di vario genere **/ class EventFrame extends JFrame { /** * Costruisce il Frame principale con le varie componenti */ public EventFrame() {

EventFrame – costruttore // Labels e TextFields per tracciare gli eventi JPanel eventFields = new JPanel(new BorderLayout()); Panel labels = new JPanel(new GridLayout(events.length,1)); JPanel traces = new JPanel(new GridLayout(events.length,1)); for (int i = 0; i < events.length; i++) { labels.add(events[i].label); traces.add(events[i].trace); } eventFields.add(labels,BorderLayout.WEST); eventFields.add(traces,BorderLayout.CENTER);

EventFrame – costruttore // Pulsanti JPanel buttons = new JPanel(new GridLayout(2,1)); buttons.add(new EventButton(Color.blue)); buttons.add(new EventButton(Color.red)); // Completa il layout setLayout(new GridLayout(1,2)); add(eventFields); add(buttons); }

Progetto dei Listeners : EventTracer MouseMotionListenerMouseListener Actiontracer ActionListener MouseTracerMouseMotionTracer

Classi interne – EventTracer private class EventTracer { /** * Costruisce il messaggio da visualizzare in risposta a * ciascun evento (sul campo testo corrispondente) * Overloade sul tipo dell'evento */ public void trace(int field, ActionEvent e) { // messaggio = numero di action events fino ad ora actionEvents++; displayMessage(field, "Event n. " + actionEvents); }

Classi interne – EventTracer public void trace(int field, MouseEvent e ) { // messaggio = numero di click consecutivi int mod = e.getModifiers(); String btn = "none"; if ( mod == 16 ) btn = "left"; else if (mod == 8 ) btn = "center"; else if (mod == 4 ) btn = "right"; displayMessage(field, btn + // + e.getX() + "," + e.getY() +")" + ", Clicks = " + e.getClickCount()); }

Classi interne – Listeners class ActionTracer extends EventTracer implements ActionListener { public void actionPerformed(ActionEvent e) { trace(ACTION, e); } ActionTracer(Color col) { super(col); } }

Classi interne – Listeners class MouseTracer extends EventTracer implements MouseListener { public void mouseClicked(MouseEvent e) { trace(MOUSE_CLICKED, e); } public void mouseEntered(MouseEvent e) { trace(MOUSE_ENTERED, e); } public void mouseExited(MouseEvent e) { trace(MOUSE_EXITED, e); } public void mousePressed(MouseEvent e) { trace(MOUSE_PRESSED, e); } public void mouseReleased(MouseEvent e) { trace(MOUSE_RELEASED, e); } MouseTracer(Color col) { super(col); } }

Classi interne – Listeners class MouseMotionTracer extends EventTracer implements MouseMotionListener { public void mouseDragged(MouseEvent e) { trace(MOUSE_DRAGGED, e); } public void mouseMoved(MouseEvent e) { trace(MOUSE_MOVED, e); } MouseMotionTracer(Color col) { super(col); } }

Classi interne – Pulsanti /** * Aree di tracciamento, definite come pulsanti * Registrano listeners per tutti gli eventi da tracciare */ class EventButton extends JButton { EventButton(Color c) { setBackground(c); addActionListener( new ActionTracer(c) ); addMouseListener( new MouseTracer(c) ); addMouseMotionListener( new MouseMotionTracer(c) ); } } // Conclude EventFrame

Esempio – Puzzle Forniamo una interfaccia grafica per il Puzzle che realizza il gioco del 15

Ricordiamo – PuzzleBoard Nella costruzione dellapplicazione, la classe PuzzleBoard funge da back-end L interfaccia grafica si limita in sostanza a fornire metodi di interazioni con il back-end

PuzzleBoard public class PuzzleBoard { /** costruisce una tabella con dimensione size */ public PuzzleBoard(int size) {... } /** il valore contenuto nella posizione (x,y) * -1 se la posizione è vuota */ public int val(int x, int y) {... } /** muove il pezzo che porta il numero w se questo * è in posizione adiacente alla posizione vuota */ public boolean move(int w) {... } /** true se la configurazione corrente è di successo */ public boolean win() {... } }

PuzzleFrame – struttura import java.awt.*; import java.awt.event.*; import javax.swing.*; class PuzzleFrame extends JFrame { // back-end private PuzzleBoard board; // dimensione del puzzle private int size; // i pezzi sull'interfaccia. Ciascun PuzzleButton è // associato alla corrispondente posizione sul backend private PuzzleButton[][] button;

PuzzleFrame – costruttore /** costruisce la tabella grafica a partire dalla * tabella b che costituisce il back-end */ public PuzzleFrame(int board_size, PuzzleBoard b) { size = board_size; board = b; button = new PuzzleButton[size][size]; setLayout(new GridLayout(size, size)); // crea i pulsanti associati ai pezzi e disponi for ( int i = 0; i != size; i = i+1 ) { for ( int j = 0; j != size; j = j+1 ) { button[i][j] = new PuzzleButton(); add(button[i][j]); } // inizializza pulsanti con i loro numeri display(); }

PuzzleFrame – refresh /** ridisegna la tabella dopo una mossa **/ private void display() { // ridisegna i numeri sui pulsanti for ( int i = 0; i != size; i = i+1 ) { for ( int j = 0; j != size; j = j+1 ) { if ( board.val(i,j) >= 0 ) { button[i][j].setBackground(Color.white); button[i][j].setText("" + board.val(i,j)); } else { button[i][j].setBackground(Color.black); button[i][j].setText( "" ); }

PuzzleFrame – refresh if (board.win()) { int response = JOptionPane.showConfirmDialog(this, "Done! Play again?"); switch (response) { case JOptionPane.YES_OPTION : board = new PuzzleBoard(size); display(); break; case JOptionPane.CANCEL_OPTION : break; default: System.exit(0); } } // chiude il metodo display()

PuzzleFrame – gestione pulsanti /** classe interna: controllore dei pulsanti */ class PuzzleButton extends JButton implements ActionListener { public PuzzleButton( ){ // numero del pulsante deciso da display() super(""); addActionListener(this); } public void actionPerformed(ActionEvent evt) { // prendi il numero di questo pulsante String s = getText(); if ( !s.equals("") ) { // non è il pulsante vuoto boolean ok = board.move(Integer.parseInt(s)); if ( ok ) { display(); } }

Componenti Swing Molte … sicuramente troppe per questo corso Consultate le API