Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento...

28
1 Introduzione Contenuti del corso Programmazione ad Oggetti Oggetti, polimorfismo, ereditarieta Metodologie di progetto Astrazione ed incapsulamento (encapsulation) Contratti e invarianti Asserzioni e documentazione Programmazione ad Eventi Interfacce grafiche Programmazione di strutture dati Collections e streams Contenuti – dettaglio 1. Introduzione: oggetti, e introduzione alla programmazione grafica 2. Definizione di classi e progetto di semplici applicazioni grafiche 3. Tipi di dato fondamentali: stringhe, array, arraylists 4. Progetto di classi: packages, pre/post condizioni, invarianti asserzioni, design,by contract. 5. Interfacce e polimorfismo , progetto di applicazioni grafiche interattive 6. Ereditarietà 7. Streams, eccezioni 8. Programmazione ad eventi e interfacce grafiche 9. Un caso di studio: Automatic Teller Machine 10. Programmazione parametrica: generics e strutture dati 11. Il framework Collection di Java 12. C# e la piattaforma .net / Design patterns

Transcript of Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento...

Page 1: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

1

Introduzione

Contenuti del corso

• Programmazione ad OggettiOggetti, polimorfismo, ereditarieta

• Metodologie di progettoAstrazione ed incapsulamento (encapsulation)Contratti e invariantiAsserzioni e documentazione

• Programmazione ad EventiInterfacce grafiche

• Programmazione di strutture datiCollections e streams

Contenuti – dettaglio

1. Introduzione: oggetti, e introduzione alla programmazione grafica2. Definizione di classi e progetto di semplici applicazioni grafiche3. Tipi di dato fondamentali: stringhe, array, arraylists4. Progetto di classi: packages, pre/post condizioni, invarianti

asserzioni, design,by contract.5. Interfacce e polimorfismo , progetto di applicazioni grafiche interattive6. Ereditarietà7. Streams, eccezioni8. Programmazione ad eventi e interfacce grafiche9. Un caso di studio: Automatic Teller Machine 10. Programmazione parametrica: generics e strutture dati11. Il framework Collection di Java12. C# e la piattaforma .net / Design patterns

Page 2: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

2

Libri di testo

• Metodologie di progetto OOObject Oriented Software Development using in Java (II Edition)Xiaoping Jia. Pearson Education, 2002

• JavaJava Concepts (V Edition)Cay Horstmann. Wiley & Sons, 2008….

Esame

• Esercitazioni e progetticonsegna durante il corsodiscussione orale

• Scrittosolo per chi consegna le esercitazioni

MP on-line

• Informazioni e news sulla pagina web del corso

http://www.dsi.unive.it/~mp

• Consegna esercitazioniAutomatica (servizio in corso di attivazione)

Page 3: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

3

JavaTM

L’ambiente diprogrammazione

JavaTM

• Alto livelloNo puntatori, no gestione esplicita dellamemoria (free/malloc)

• EspressivoFacilmente estendibile con nuovi tipi di dato, ricca collezione di tipi nelle librerie

• Portabile: bytecode eseguibile su JVM

• Robustocontrollo dei tipi forte, analisi di sicurezza

JavaTM – nato per la rete

Page 4: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

4

Versioni di JavaTM

Aggiornamento delle Librerie20061.6

Generics, auto-boxing, for loops20051.5

Asserzioni20021.4

Nuovo compilatore20001.3

Swing e Collections19981.2

Classi interne19971.1

Prima versione19961.0

NovitàAnnoVersione

La piattaforma JavaTM

Compilazione ed Esecuzione

A.java A.class

BytecodeSorgente

Page 5: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

5

Una vecchia conoscenza . . .

1: public class HelloTester2: { 3: public static void main(String[] args) 4: { 5: // Scrivi in output un saluto6:7: System.out.println("Hello, World!"); 8: } 9: }

Il cuore del programma

• Una chiamata di metodo

Compilazione ed esecuzione

• Compilazionejavac HelloTester.java

• Se ha successo crea il fileHelloTester.class

• Esecuzionejava HelloTester.class

• OutputHello World!

Page 6: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

6

JVM – Java Virtual Machine

• Una macchina astratta: esegue codice intermedio (bytecode)specifica (istruzioni, registri, heap,…) indipendente dall’architettura sottostante

• Indipendente dal sistema operativo

• Presente nei browser più diffusi

• Implementazioni specifiche per smart card, palmari, cellulari (KVM) …

Java Virtual Machine• CLASS LOADER

carica in memoria tutte le classinecessarie al programma (anchequelle delle librerie usate)

• BYTECODE VERIFIERControlla l’integrità degli accessi in memoria, verifica l’aderenza allaspecifica della JVM, …

• SECURITY MANAGERverifica la sicurezza delle classicaricate a run time, controlla gliaccessi ai file, …

JVM

Security Manager

Bytecode Verifier

Class Loader

Interpreter

JAVAIL LINGUAGGIO

Page 7: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

7

Tipi e variabili• Ogni valore nel linguaggio ha un tipo

• Ogni variabile deve essere dichiarata edassociata ad un tipo:

• Il tipo determina quali sono le operazionilegali sui valori (e le variabili)

• Variabili di un tipo possono solo assumerevalori di quel tipo

String greeting = "Hello, World!";PrintStream printer = System.out;int luckyNumber = 13;

Operatore di assegnamento

• =

• Modifica il valore delle variabiliint luckyNumber = 13; // inizializzazioneluckyNumber = 12; // assegnamento

Oggetti

• Entità manipolabili all’interno di un programma (mediante i metodi)

• Di un oggetto non necessariamenteconosciamo la struttura interna

• La cosa importante è che l’oggetto abbia un comportamento ben definito

una interfaccia verso l’esterno ben definita

• È tutto quello che ci serve per utilizzarel’oggetto

Page 8: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

8

Programmazione procedurale

• Scopo: trovare la sequenza di passi che risolve il problema

• Incentrata sulla ricerca dell’algoritmo risolutivo

Programmazione ad oggetti

• Identifica gli oggetti del sistema e ne definisce struttura interna e interfaccia

• Coordina le interazioni tra oggetti, basandosi sulle interfacce

? ?

?

Classi e oggetti

• Ogni oggetto appartiene ad una classe. • Ad esempio System.out appartiene alla

classe PrintStream

Page 9: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

9

Metodi• Codice che permette di accedere ai dati di un

oggetto

• I dati / lo stato di un oggetto sono accessibilisolo attraverso i metodi dell’oggetto

• La classe definisce i metodi dei suoi oggetti

• Interfaccia pubblica: specifica quali sono i metodi invocabili sugli oggetti della classe

Continua…

Due oggetti di tipo String

Metodi della classe String

• length: conta il numero di caratteri dellastringa

Continua…

String greeting = "Hello, World!";

int n = greeting.length(); // n = 13

Oggetto Metodo

Page 10: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

10

Metodi della classe String

• toUpperCase: crea un altro oggetto di tipoString che contiene i caratteri della stringaoriginaria, ma convertiti in maiuscolo

Continua…

String fiume = "Mississippi";String fiumeInUpperCase = fiume.toUpperCase(); // fiumeInUpperCase = "MISSISSIPPI"

Metodi della classe String

• L’invocazione di un metodo su un oggetto èlegale solo se il metodo è parte dell’interfaccia pubblica della classe a cui l’oggetto appartiene

System.out.length(); // ERRORE

Oggetti di classe Rectangle

• Definita nella libreria java.awt

• Descrivono un rettangolo posizionato ad unadata coordinata sul piano

(x,y) = origine: angolo in alto a sinistra

Page 11: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

11

Costruttori

• Il costrutto new costruisce un nuovo oggettodi tipo rettangolo

• Usa i parametri (5, 10, 20, e 30) per inizializzare I dati dell’oggetto

• Restituisce un riferimento all’oggetto

• Tipicamente il risultato viene assegnato ad una variabile

Rectangle box = new Rectangle(5, 10, 20, 30);

new Rectangle(5, 10, 20, 30)

Costruttori

• Una classe può fornire più di un costruttore(sempre con lo stesso nome) all’interno dellastessa classe

• fornisce diverse modalità di creazione dioggetti

new Rectangle()// costruisce un rettangolo con origine (0,0)// larghezza 0, e altezza zero 0

Sintassi: new

new ClassName(parameters)

Esempio:new Rectangle(5, 10, 20, 30)new Rectangle()

• Costruisce un nuovo oggetto, inizializza lo stato con i parametri, e restituisce un riferimento all’oggetto costruito.

Page 12: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

12

Metodi della classe Rectangle

• getWidth: restituisce il valore che corrispondealla base del rettangolo

• translate: modifica l’oggetto su cui vieneinvocato modificando le coordinate dellaposizione

• Mutators: metodi con side effectsContinua…

box.translate(15, 25);

Metodi e side-effects

box.translate(15, 25);

Parametri espliciti e impliciti• Parametri = dati in input per i metodi

• Non tutti i metodi hanno parametri

• Tutti i metodi hanno un parametro implicito: l’oggetto su cui il metodo viene invocato

Continua…

System.out.println(greeting) greeting.length() // no parametri espliciti

System.out.println(greeting)

Page 13: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

13

Parametri espliciti e impliciti

“Hello, World” è un parametro passato al metodo println

Parametri espliciti e impliciti

• Replace: ancora un metodo su stringhe

• Parametri:Uno implicito: "Mississippi"Due espliciti: "issipp" e "our"

• Risultato: "Missouri"

Continua…

fiume.replace("issipp", "our");

Parametri espliciti e impliciti

Page 14: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

14

Definizione di metodi

• La definizione di un metodo specificai parametri espliciti con i loro tipiil tipo del risultato

• Il tipo del parametro implicito non vienespecificato

è la classe di cui la definizione di metodo faparte

Continua…

Definizione di metodi• I metodi che non restituiscono valori sono dichiarativoid

• Overloading:Un nome di metodo si può usare in più definizioniSe le definizioni sono nella stessa classe diciamo cheil nome è overloaded Le versioni di un metodo overloaded devono avereparametri diversi

public void println(String output) // classe PrintStream

public void println(String output)public void println(int output)

Oggetti e riferimenti

• Un riferimento è una astrazione del puntatoread un oggetto

• L’operatore new restituice un riferimento ad un nuovo oggetto

• Diverse variabili di tipo oggetto possonocondividere lo stesso riferimentoRectangle box = new Rectangle(5, 10, 20, 30);Rectangle box2 = box;box2.translate(15, 25);

Rectangle box = new Rectangle();

Continua…

Page 15: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

15

Riferimenti ad oggetti

• Il comportamento delle variabili varia rispettoal loro tipo.

• In particolare le variabili di tipo primitivo sicomportano in modo diverso rispetto allevariabili di tipo oggetto

• Le differenze si manifestano negli effettidell’istruzione di assegnamento

Variabili di tipo primitivo

Contengono valori del loro tipo

Variabili di tipo oggetto

Contengono riferimenti ad oggetti, non oggetti

Page 16: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

16

Assegnamento su tipi primitivi• int luckyNumber = 13;

int luckyNumber2 = luckyNumber;luckyNumber2 = 12;

Due variabili, due valori distinti

Assegnamento su tipi oggetto• Rectangle box = new Rectangle(5, 10, 20, 30);

Rectangle box2 = box;box2.translate(15, 25);

Continua…

Assegnamento su tipi oggetto

Due variabili, stessoriferimento

Page 17: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

17

Classi test

Ovvero: come eseguire il test di una classe

• Definisci una nuova classe• Definisci un metodo main

• All’interno del main costruisci uno o piùoggetti delle classi da testare

• Invoca i metodi su tali oggetti

• Stampa i risultati

File MoveTester.java01: import java.awt.Rectangle;02:03: public class MoveTester04: {05: public static void main(String[] args)06: {07: Rectangle box = new Rectangle(5, 10, 20, 30);08:09: // Sposta il rettangolo10: box.translate(15, 25);11:12: // Stampa nuove info13: System.out.println(“Origine dopo la traslazione:”); 14: System.out.println(box.getX());15: System.out.println(box.getY());16: }17: }

Classi di libreria

• Sempre includere le classi di libreriautilizzate dall’applicazione

classi delle librerie raggruppate in packages

Importiamo le classi specificando i nomi dipackage e di classe

Le classi del package java.lang (ad esempio String e System)sono importateautomaticamente

import java.awt.Rectangle;

Page 18: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

18

Sintassi: import

import packageName.ClassName;

Esempio:import java.awt.Rectangle; // importa la classe Rectangle

import packageName.*;

Esempio:import java.util.*; // importa tutte le classi del package

Documentazione sulle API

• API: Application Programming Interface

• Include la descrizione delle classi e dei relativimetodi della (fornitissima!) libreria Java

• http://java.sun.com/j2se/1.5/docs/api/index.html

• http://java.sun.com/j2se/1.6/docs/api/index.html

Documentazione sulle API

Page 19: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

19

La API della classe Rectangle

Javadoc Method Summary

Documentazione del metodo translate

Page 20: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

20

Elementi diprogrammazione grafica

Contenuti

• Introduzione alle applicazione di graficacontesto graficiforme geometriche elementaricolori“input dialogs” per ottenere input dall’utente

• Frames e applets

Frames• La classe JFrame

• import javax.swing.*;

JFrame frame = new JFrame();frame.setSize(300, 400);frame.setTitle(“Un frame vuoto");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);

Page 21: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

21

Frames

File EmptyFrameViewer.java01: import javax.swing.*;02:03: class EmptyFrameViewer04: {05: public static void main(String[] args)06: {07: JFrame frame = new JFrame();08:09: final int FRAME_WIDTH = 300;10: final int FRAME_HEIGHT = 400;11:12: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);13: frame.setTitle(“Un frame vuoto");14: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);15:16: frame.setVisible(true);17: }18: }

Disegno di forme geometriche• JComponent

La classe che definisce contenitorigenerici, al al cui interno includiamoforme geometriche

• Figure geometriche incluse in nuoviJComponentclass ShapeComponent extends JComponent{. . .}

Page 22: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

22

Disegno di forme geometriche• paintComponent

il metodo invocato (automaticamente) tutte le volte che il componente per il quale e` definitoviene ridisegnatoè in questo metodo che si produce il disegno

class ShapeComponent extends JComponent{

public void paintComponent(Graphics g){

// Converti in Graphics2DGraphics2D g2 = (Graphics2D) g;. . .

}}

Disegno di forme geometriche

• Graphics classe che permette di manipolare lo stato della componente grafica(posizione/colore corrente)

• Graphics2D classe con metodi per la creazione e il disegno di figure geometriche

• Usa un cast per ottenere un oggetto di tipoGraphics2D dal parametro di tipo Graphics

• package java.awt

Rectangle r = new Rectangle(5, 10, 20, 30);g2.draw(rect);

File ShapeComponent.java01: import java.awt.Graphics;02: import java.awt.Graphics2D;03: import java.awt.Rectangle;04: import javax.swing.JPanel;05: import javax.swing.JComponent;06:07: /**08: Un Component che disegna due rettangoli.09: */10: class ShapeComponent extends JComponent11: { 12: public void paintComponent(Graphics g)13: { 14: // Ottieni un graphics2D15: Graphics2D g2 = (Graphics2D) g;16:

Continua…

Page 23: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

23

File ShapeComponent.java

17: // Costruisci un rettangolo e disegna18: Rectangle r = new Rectangle(5, 10, 20, 30);19: g2.draw(r);20:21: // Trasla il rettangolo (15 a dx, 25 in basso) 22: r.translate(15, 25);23:24: // Disegna il rettangolo traslato25: g2.draw(r);26: }27: }

Applicazioni

• ShapeViewer

classe che lancia una finestra all’interno dellaquale vengono raffigurate Ie componentiL’applicazione è costruita interamenteall’interno del metodo main della classeDisegna due rettangoli

Continua…

Applicazione ShapeViewer

Page 24: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

24

Il metodo main

1. Costruisci il frame2. Costruisci un oggetto della classe component

3. Aggiunti il component al frame

La chiamata è leggermente più complicata per versioni di Java precedenti alla 5:

4. Rendi visibile il frame

ShapeComponent component = new ShapeComponent();

frame.add(component);

frame.getContentPane().add(component);

File ShapeViewer.java

01: import javax.swing.JFrame;02:03: class ShapeViewer04: {05: public static void main(String[] args)06: {07: JFrame frame = new JFrame();08:09: final int FRAME_WIDTH = 300;10: final int FRAME_HEIGHT = 400;11: 12: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);13: frame.setTitle(“Due rettangoli");14: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);15:

Continua…

File ShapeViewer.java

16: ShapeComponent component = new ShapeComponent();17: frame.add(component);18:19: frame.setVisible(true);20: }21: }

Page 25: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

25

Applets

• Applets sono applicazioni eseguiteall’interno di un browser

• L’implementazione di un Applet utilizza ilpattern seguente: public class MyApplet extends JApplet{

public void paint(Graphics g){

// Ottieni un contesto graficoGraphics2D g2 = (Graphics2D) g;// Istruzioni per il disegno. . .

}}

Applets

• La struttura è molto simile a quella di un JComponent, con due differenze: 1. Estendiamo JApplet, invece di

JComponent

2. IL codice del disegno è parte del metodopaint, invece che del metodopaintComponent

• Per eseguire un applet, dobbiamo creare un file HTML ed inserire il codice che lancial’applet mediante la tag applet

Applets

• Un file HTML può avere diversi applets, ciascuno dei quali introdotto da unacorrispondente tag (di tipo applet)

• Un applet può essere lanciato mediantel’appletviewer, o all’interno di un browser in cui Java sia stato abilitato.

appletviewer RectangleApplet.html

Page 26: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

26

File ShapeApplet.java

01: import java.awt.Graphics;02: import java.awt.Graphics2D;03: import java.awt.Rectangle;04: import javax.swing.JApplet;05:06: /**07: Un applet che disegna due rettangoli.08: */09: public class ShapeApplet extends JApplet10: { 11: public void paint(Graphics g)12: { 13: // Ottieni un contesto grafico14: Graphics2D g2 = (Graphics2D) g;

Continua…

File ShapeApplet.java

17: // Costruisci un rettangolo e disegna18: Rectangle r = new Rectangle(5, 10, 20, 30);19: g2.draw(r);20:21: // Trasla il rettangolo (15 a dx, 25 in basso) 22: r.translate(15, 25);23:24: // Disegna il rettangolo traslato25: g2.draw(r);26: }27: }

File ShapeAppletViewer.html

<html> <head>

<title>Due rettangoli</title> </head> <body>

<p>Here’s my first applet:</p> <applet code="RectangleApplet.class" width="300" height="400"></applet>

</body></html>

Page 27: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

27

Applets

Forme Geometriche

• Rectangle, Ellipse2D.Double,Line2D.Double fornite dal package java.awt

• Alcune di queste classi, e.g. Line2D.Double, sono interne. Per il momento ignoriamo questoaspetto, ma notiamo la dichiarazione import

• Per disegnare una forma dobbiamo costruirla e disegnarlaEllipse2D.Double e = new Ellipse2D.Double(x, y, width, height);g2.draw(e);

import java.awt.geom.Ellipse2D; // no .Double

Una ellisse e la sua bounding box

Page 28: Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento delle Librerie 1.5 2005 Generics, auto-boxing, for loops 1.4 2002 Asserzioni 1.3 2000

28

Linee

• Due modi per disegnare una linea:

oppure,

Line2D.Double segmento = new Line2D.Double(x1, y1, x2, y2);

Point2D.Double from = new Point2D.Double(x1, y1);Point2D.Double to = new Point2D.Double(x2, y2);Line2D.Double segmento = new Line2D.Double(from, to);

Stringhe

g2.drawString("Message", 50, 100);

Colori

• Colori standard Color.BLUE, Color.RED, …

• Nuovi colori: formato rgb settando i valori dellecomponenti red, green, blue tra 0.0F e 1.0F

• setColor setta il colore del Graphic Contexts

• Usa il colore con i metodi draw e fill

g2.setColor(magenta);

g2.fill(rectangle); // riempito con il colore corrente

Color magenta = new Color(1.0F,0.0F,1.0F), // F = float