Laboratorio di IUM
Lezione 2
Introduzione a Java2D
Di Blasi Gianpiero - D.M.I. - Università di Catania
Cosa impareremo oggi?
●
La classe Graphics ed il metodo
paintComponent()
●
Le coordinate del contesto grafico
●
Colori, testo e font
●
Il disegno di forme geometriche mediante linee
●
Il disegno di rettangoli ed ovali
●
Il riempimento delle forme
●
Le modalità di pittura
●
Il disegno di immagini
La classe Graphics ed il metodo
paintComponent (1)
●
Domande:
–
–
–
●
●
cosa è un oggetto di tipo Graphics?
cosa fa il metodo paintComponent(Graphics g)?
a cosa ci servono per fare grafica?
Capirlo ci aiuterà a ottenere frame più interessanti
Come al solito bisogno fare ricorso alla
documentazione
La classe Graphics ed il metodo
paintComponent (2)
●
●
Tutti gli oggetti che discendono da JComponent
hanno questo metodo per “disegnarsi”
Affinché per ogni componente faccia ciò che si
desidera il metodo va “sovrascritto” con una
nuova adeguata definizione
public void paintComponent(Graphics g)
{
//Per ereditare le operazioni standard
super.paintComponent(g);
//Seguono istruzioni specifiche di disegno per questa
//componente…
}
La classe Graphics ed il metodo
paintComponent (3)
●
Chi chiama paintComponent?
–
●
Per forzarne la chiamata usare il metodo:
–
●
viene chiamato automaticamente ogni qualvolta sia
necessario. Non deve essere chiamato manualmente
void repaint(): forza il ridisegno della finestra
Quali azioni attivano il paintComponent?
–
tutto ciò che provoca un ridisegno della finestra
(ridimensionamento della finestra, riduzione ad icona,
massimizzazione, sovrapposizione di finestre, ecc.)
La classe Graphics ed il metodo
paintComponent (4)
●
●
●
Per lavorare il paintComponent ha bisogno di un
oggetto Graphics
Esso è la sua “memoria” e il suo “libretto di
istruzioni” per eseguire i comandi di disegno che
chiederemo nel nostro codice
Un Graphics (contesto grafico) viene creato dal
JComponent appena deve essere disegnato la
prima volta
La classe Graphics ed il metodo
paintComponent (5)
●
Graphics mantiene le seguenti informazioni:
–
–
–
–
–
–
–
–
l'oggetto sul quale si disegna
il sistema di coordinate adottato per disegnare
il colore di foreground (colore con cui disegnare)
il font usato per le stringhe e le sue proprietà
il “clip” (ritaglio)
la modalità di disegno (Paint o XOR)
la modalità di trasparenza e di blending
tanto altro ancora...
La classe Graphics ed il metodo
paintComponent (6)
●
Graphics è una classe astratta
●
Essa viene specializzata da:
–
–
●
i vari SO in funzione delle loro caratteristiche di
disegno
le varie Component che hanno diritto ad un contesto
grafico a seconda delle necessità e dei limiti di
ciascuna componente
Si possono così programmare operazioni grafiche
su tutte le componenti senza dovere prestare
troppa attenzione a quale tipo di componente si
stia elaborando
Le coordinate del contesto grafico
●
●
●
La grafica al computer adotta un sistema di
riferimento “inusuale”
Per gli oggetti racchiusi in un rettangolo l'origine
è sempre il vertice in alto a sinistra del rettangolo
Le “misure” sono sempre in pixel
(0,0)
x
y
I colori (1)
●
●
●
Le informazioni sui colori in Java vengono
mantenute in oggetti della classe Color
I colori possono essere descritti tramite vari
“modelli”
In Java i colori sono definiti da 4 componenti:
–
–
–
trasparenza (alfa), Red/Green/Blue
tutti i valori sono compresi nel range [0, 255]
ogni colore del computer è “somma” dei tre contributi
dei colori base, più un'eventuale trasparenza
I colori (2)
●
Esempi di costruttori di Color:
–
Color(float R, float G, float B): R,G,B in [0, 1], alfa=1
–
Color(float R, float G, float B, float alfa): R,G,B, alfa in
[0, 1]
–
Color(int R, int G, int B): R,G,B in [0, 255], alfa=255
–
Color(int R, int G, int B, int alfa): R,G,B, alfa in [0, 255]
I colori (3)
●
Esempi:
–
–
–
●
Color bianco = new Color(255, 255, 255);
Color nero = new Color(0,0,0);
Color giallo = new Color(255,255,0);
Esistono anche delle costanti predefinite nella
classe Color:
–
black, white, red, green, blue, cyan, magenta, yellow,
pink, gray, ecc.
I colori (4)
●
Per impostare il colore della classe Graphics
bisogna usare il metodo:
–
●
●
●
void setColor(Color c): imposta il colore della classe
Graphics
Dopo questo comando tutto ciò che verrà
disegnato userà il colore specificato
Se si fosse settata anche la trasparenza il disegno
sarebbe stato semi-trasparente
Il colore di default è il nero
I colori (5)
●
Oltre a setColor(...), si può intervenire sul colore
da usare per i disegni ed il testo e sul colore da
usare per lo sfondo di una componente
direttamente con metodi della componente:
–
–
●
void setBackground(Color c): imposta il colore dello
sfondo
void setForeground(Color c): imposta il colore in
primo piano
Attenzione!!
–
Non usare nel paintComponent()
I colori (6)
Esempio
ColorHelloWorld2D
Testo e Font (1)
●
●
●
Le stringhe in Java vengono “disegnate”
mediante la classe Font contenente tutte le
caratteristiche tipografiche necessarie
Tale classe può richiamare tutti i font presenti nel
SO
Se si vuole però rendere le proprie applicazioni
“compatibili” con qualsiasi SO è meglio adottare
solo alcuni tipi di font “standard”
Testo e Font (2)
●
Font standard (predefiniti) di Java:
–
Serif (una sorta di Times New Roman)
Esempio: L'Italia è una repubblica democratica fondata
sul lavoro...
–
SansSerif (una sorta di Arial)
–
Esempio: L'Italia è una repubblica democratica
fondata sul lavoro...
–
Monospaced (una sorta di Courier
New)
–
Esempio: L'Italia è una repubblica
democratica fondata sul lavoro...
–
Testo e Font (3)
●
Esistono altri due font predefiniti:
–
–
●
●
●
Dialog
InputDialog
Questi due font sono simili rispettivamente a
SansSerif e Monospaced e sono poco utilizzati
Questa mappatura appena descritta vale sulle
principali piattaforme (Windows, Linux, Mac)
Non è detto che valga anche su altre piattaforme
Testo e Font (4)
●
●
I font possono avere anche uno stile
La classe Font di Java lo identifica con delle
costanti intere:
–
–
–
–
Font.PLAIN
Font.BOLD
Font.ITALIC
Font.BOLD+Font.ITALIC
Forza Azzurri!!!
Forza Azzurri!!!
Forza Azzurri!!!
Forza Azzurri!!!
Testo e Font (5)
●
È ovviamente possibile definire anche una
dimensione (espressa in punti):
–
8 punti:
10 punti:
12 punti: In Sicilia turismo è cultura
24 punti: In Sicilia turismo è cultura
–
32 punti: In Sicilia turismo è cultura
–
48 punti:
–
–
–
In Sicilia turismo è cultura
In Sicilia turismo è cultura
In Sicilia turismo è cultura
Testo e Font (6)
●
Per definire un Font si può utilizzare il
costruttore:
–
●
Font(String name, int style, int size): costruisce un font
di tipo name, con uno stile style ed una dimensione
size
Per impostare il Font del contesto grafico bisogna
invece usare il metodo:
–
void setFont(Font f): imposta il Font del contesto
grafico
Testo e Font (7)
●
Domanda&Risposta:
–
●
Java ha un oggetto apposito (FontMetric):
–
–
●
se uso diversi font come faccio a sapere le dimensioni
di una determinata stringa? Devo ottenere informazioni
sulla “metrica” del Font
FontMetric getFontMetric(): restituisce la metrica del
Font attualmente utilizzato dal contesto grafico
FontMetric getFontMetric(Font f): restituisce la
metrica del Font passato come parametro
Dettagli interessanti ma troppo “specifici”...
Testo e Font (8)
Esempi
ColoredFrame
ArlecchinoFrame_a1
ArlecchinoFrame_a2
Esercizi
●
Creare un frame il cui sfondo cambia colore man
mano che esso viene ridimensionato:
–
–
–
●
il colore ha componente rossa pari a 128 fissa
la componente verde è proporzionale alla larghezza
la componente blu è proporzionale all'altezza
Creare un frame con colore, dimensione del font,
famiglia del font, stile del font e messaggio
forniti mediante JOptionPane
Ancora sui font (1)
●
Per sapere quali font sono disponibili in un
particolare computer occorre chiamare il metodo:
–
●
String[] getAvailableFontFamilyNames(): restituisce i
font disponibili presenti sul computer
Tale metodo si trova nella classe
java.awt.GraphicsEnvironment
–
tale classe “descrive” l'ambiente grafico del sistema
–
GraphicsEnvironment getLocalGraphicsEnvironment():
restituisce l'ambiente grafico del sistema
Ancora sui font (2)
Esempi
AvailableFont_a1
AvailableFont_a2
Non solo lettere (1)
●
È possibile disegnare:
–
–
–
●
●
forme elementari (piene e vuote)
linee e spezzate (chiuse e aperte)
poligoni complessi
Si possono impostare stili, spessori e colori
Segue un elenco di metodi (la maggior parte di
loro si spiega da se!)
Non solo lettere (2)
●
Per disegnare un segmento:
–
●
void drawLine(int x1, int y1, int x2, int y2): disegna
una linea continua
Per disegnare un punto:
–
void drawLine(int x1, int y1, int x1, int y1): disegna un
punto
Non solo lettere (3)
Esempio
LinesFrame
Non solo lettere (4)
●
Per disegnare un poligono:
–
–
●
Per disegnare una spezzata:
–
●
void drawPolygon(Polygon p): disegna un poligono
void drawPolygon(int[] x, int[] y, int npoints): disegna
un poligono
void drawPolyline(int[] xCoord, int[] yCoord, int
npoints): disegna una spezzata
Per disegnare un arco:
–
void drawArc(int x, int y, int width, int height, int
startAngle, int arcAngle): disegna un arco
Non solo lettere (5)
Esempi
PolyFrame_a1
PolyFrame_a2
PolyFrame_a3
PolyFrame_a4
PolyFrame_a5
Non solo lettere (6)
Per disegnare rettangoli e ovali:
–
void drawRect(int x, int y, int width, int height):
disegna un rettangolo
void drawOval(int x, int y, int width, int height):
disegna un ovale
(x, y)
(x, y)
height
–
height
●
width
width
Non solo lettere (7)
Per disegnare rettangoli arrotondati:
void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight): disegna un rettangolo
arrotondato
(x, y)
arcWidth
arcHeight
–
height
●
width
Non solo lettere (8)
Esempio
RectEllipseFrame_a1
Considerazioni finali sulle primitive
di disegno (1)
●
Esistono una serie di metodi analoghi ai
precedenti per il riempimento di forme:
–
–
–
–
–
–
void fillPolygon(Polygon p)
void fillPolygon(int[] x, int[] y, int npoints)
void fillArc(int x, int y, int width, int height, int
startAngle, int arcAngle)
void fillRect(int x, int y, int width, int height)
void fillOval(int x, int y, int width, int height)
void fillRoundRect(int x, int y, int width, int height, int
arcWidth, int arcHeight)
Considerazioni finali sulle primitive
di disegno (2)
Esempi
PolyFrame_b1
RectEllipseFrame_b1
Esercizio
●
●
Disegnare una faccia
come in figura
Permettere all'utente
di scegliere il colore
di faccia, occhi,
naso, bocca e capelli
mediante
JOptionPane
La modalità di pittura (1)
●
●
●
Quando vengono disegnate forme sovrapposte,
l'ultima forma viene disegnata sopra tutto il resto
Oltre a questa modalità mediante “sovrascrittura”
è possibile dipingere con la modalità XOR
Per attivarla bisogna utilizzare il comando:
–
●
void setXORMode(Color xorColor): imposta la
modalità XOR
Per tornare alla modalità normale si usa il
comando:
–
void setPaintMode(): ritorna alla modalità normale
La modalità di pittura (2)
●
Modalità Paint:
–
●
sovrascrive la traccia del nuovo disegno nel colore
corrente senza tenere conto di cosa c'è già nei pixel su
cui si disegna
Modalità XOR:
–
per ottenere il colore con cui disegnare effettua uno
XOR logico tra il colore impostato, il colore presente
nei pixel ed un terzo colore impostato dall'esterno
La modalità di pittura (3)
Esempi
XORFrame_a1
XORFrame_a2
XORFrame_a3
XORFrame_a4
Immagini (1)
●
●
●
Java può caricare, mostrare, salvare ed elaborare
immagini in vari formati
Parecchia attenzione sarà dedicata nel corso di
I&M
In questa fase però vogliamo completare la
trattazione delle primitive grafiche 2d mostrando
come caricare e utilizzare le immagini in un
Frame
Immagini (2)
●
●
Per caricare un'immagine in Java si usano le
classi Toolkit ed Image
In particolare la classe Toolkit mette a
disposizione i metodi:
–
–
●
Image getImage(String filename): carica un'immagine
dal file specificato
Image getImage(URL url): carica un'immagine
dall'URL specificato
In realtà ciò non basta (e ci sono metodi più
facili), maggiori dettagli nel corso di I&M
Immagini (3)
●
Per disegnare un'immagine bisogna utilizzare un
apposito metodo di Graphics:
–
boolean drawImage(Image img, int x, int y,
ImageObserver observer): disegna un'immagine alle
coordinate (x, y) del contesto grafico
–
boolean drawImage(Image img, int x, int y, int width,
int height, ImageObserver observer): disegna
un'immagine alle coordinate (x, y) del contesto grafico
riscalata alle dimensioni (width, height)
Immagini (4)
Esempi
ImageFrame_a1
ImageFrame_a2
Scarica

Color - Gianpiero Di Blasi