Guida alla programmazione delle GUI, interfacce grafiche in Java 2D - 20: il riempimento semplice, l'interfaccia Shape, forme geometriche
Capitolo 20: Il disegno avanzato in Java2D: il riempimento semplice, l'interfaccia Shape, forme geometriche.
Java2D mette a disposizione diverse classi ed interfacce per definire riempimenti e forme geometriche (sia vuote che ripiene).
Iniziamo con il riempimento semplice (vedremo il riempimento con gradienti e textures tra due capitoli): il riempimento può essere definito mediante l'interfaccia Paint e le classi che la implementano.
Una delle classi che implementa tale interfaccia è Color, il cui utilizzo è stato esaminato del capitolo 14 di questa guida e non verrà qui ripreso; le altre due classi sono GradientPaint e TexturePaint, che verranno prese in esame tra due capitoli.
Per definire forme geometriche, Java2D fornisce la classe Shape, i cui metodi principali sono elencati e descritti nella seguente tabella:
| contains(double x, double y) : boolean |
Verifica se il punto di coordinata (x,y) è contenuto all'interno della forma geometrica (restituisce true in caso affermativo, false altrimenti). |
| contains(Point2D p) : boolean |
Analogo al precedente ma passando come parametro direttamente un oggetto Point2D (utile, ad esempio, se il Point2D può trovarsi in punti diversi in momenti diversi). |
| contains(double x, double y, double width, double height) : boolean |
Verifica se il rettangolo con vertice in alto a sinistra in (x,y), larghezza width ed altezza height è contenuto nella forma geometrica (restituisce true in caso affermativo, false altrimenti). |
| contains(Rectangle2D r) : boolean |
Analogo al precedente ma qui il rettangolo è identificato direttamente con un oggetto Rectangle2D (utile in caso di rotazioni o traslazioni del rettangolo nel corso dell'esecuzione del programma, ad esempio). |
Classi 'native' di Java2D che implementano l'interfaccia Shape sono ad esempio:
- Line2D;
- Rectangle2D;
- RoundRectangle2D;
- Ellipse2D;
- Arc2D;
- Point2D;
- QuadCurve2D;
- CubicCurve2D;
- GeneralPath;
- Area.
Un elenco di costruttori, campi e metodi di tutte queste classi richiederebbe troppo spazio e, nella maggior parte dei casi, risulterebbe ripetitivo; si rimanda, quindi, alle API ufficiali.
Vediamo, invece, quali sono i metodi messi a disposizione da Graphics2D per impostare il riempimento, disegnare forme geometriche o impostare un clip di ritaglio (metodi da utilizzare all'interno di paintComponent):
| setPaint(Paint p) : void |
Imposta il parametro p come tipo di riempimento (come vedremo, anche sfumato o gradiente) da adottare per il contesto grafico. |
| setClip(Shape s) : void |
Imposta la forma s passata come parametri come clip di ritglio. |
| draw(Shape s) : void |
Disegna la forma s passata come parametro senza riempimento (solo i contorni). |
| fill(Shape s) : void |
Disegna la forma s passata come parametro con riempimento. |
Merita un'attenzione particolare la classe Area, che permette di combinare più forme geometriche, semplici e complesse.
Area ha due costruttori:
Metodi utili messi a disposizione da tale classe sono, ad esempio, i seguenti:
| add(Area a) : void |
Aggiunge, all'Area che invoca il metodo, i punti appartenenti all'Area passata come parametro. Il risultato verrà 'depositato' nell'Area che invoca il metodo. |
| subtract(Area a) : void |
Rimuove, dai punti appartenenti all'Area che invoca il metodo, i punti appartenenti all'Area passata come parametro. Il risultato verrà 'depositato' nell'Area che invoca il metodo. |
| intersect(Area a) : void |
Effettua un'intersezione tra l'Area che invoca il metodo e quella passata come parametro. Il risultato verrà 'depositato' nell'Area che invoca il metodo. |
| exclusiveOr(Area a) : void |
Effettua uno XOR dei punti tra l'Area che invoca il metodo e quella passata come parametro. Il risultato verrà 'depositato' nell'Area che invoca il metodo. |
|