IGEA Esercitazione in laboratorio del 2 maggio 2005 Contenuto 1. Colori in Java 2. Ampiezza penna 3. Finestre di dialogo 4. Disegno di figure geometriche 5. Esercitazione pratica Uso dei colori Si basa sulla classe java.awt.Color. Ogni oggetto della classe Color identifica un preciso colore, definito al momento della sua istanziazione. In particolare, è possibile definire un colore specificando la quantità di colori fondamentali (RGB, red, green, blue) che esso contiene; la quantità di colore viene espressa o mediante un intero (0 – 255) o mediante un float (0 – 1). Così new Color (0, 255, 0) crea un oggetto associato al colore verde (massima intensità), mentre new Color(255, 255, 255) crea un oggetto associato al colore bianco (massima intensità di ciascuna dei tre colori fondamentali). Il costruttore è sovraccarico e può accettare anche un quarto parametro, denominato parametro alpha, che specifica il livello di trasparenza del colore, espresso mediante un intero (0 – 255, 255 = min trasparenza) o mediante un float (0 – 1, 1 = min trasparenza). Esempi: new Color(0, 255, 0) new Color(255, 0, 0, 128) La loro sovrapposizione (secondo colore sopra al primo) è di seguito illustrata: Per usare i colori più diffusi non è necessario istanziare la classe Color, poiché sono già definite varie costanti static static static static static static static Color Color Color Color Color Color Color BLACK BLUE CYAN DARK_GRAY GRAY GREEN LIGHT_GRAY static static static static static static Color Color Color Color Color Color MAGENTA ORANGE PINK RED WHITE YELLOW La classe definisce anche corrispondenti costanti con identificatori completamente minuscoli (black, blue, cyan ecc.). Per cambiare colore usato in grafica si può usare il metodo setColor(<colore>) della classe Grahics2D: ad esempio, se g2D è un riferimento a un oggetto Graphics2D, g2D.setColor(Color.PINK) farà usare, nelle successive operazioni grafiche, una penna di colore rosa. Definizione dell’ampiezza della penna Per modificare l’ampiezza della penna si può usare il metodo setStroke(<oggetto BasicStroke>) della classe java.awt.Graphics2D, come nell’esempio illustrato. import java.awt.BasicStroke; … g2D.setColor(Color.PINK); g2D.draw(r4); g2D.setStroke(new BasicStroke((float)3.5)); g2D.draw(r5); In particolare, new BasicStroke((float)3.5) crea un oggetto che specifica un tratto di penna ampio 3.5 pixel (si noti che il costruttore di BasicStroke richiede un parametro float e non double). Dialogo con l’utente tramite JOptionPane La classe javax.swing.JOptionPane mette a disposizione dei metodi per il dialogo con l’utente tramite una apposita finestra. In particolare, il metodo static String showInputDialog(<stringa>) mostra all’utente una finestra con il messaggio specificato da <stringa>, consentendogli di specificare un input, restituito come stringa dal metodo stesso. Altri metodi: showConfirmDialog(…) per porre una domanda all’utente, con risposta del tipo yes/no/cancel, e showMessageDialog(…) per notificare informazioni all’utente. L’input ottenuto tramite showInputDialog può essere trasformato in numeri tramite i metodi static int Integer.parseInt(<stringa>) e static int Double.parseDouble(<stringa>). Nel caso l’utente debba fornire più input (ad esempio una coppia di numeri) è possibile consentire all’utente di scriverli in un’unica stringa, separati da spazi, sfruttando i servizi della classe java.util.StringTokenizer per ricavare le singole componenti (sottostringhe) della stringa di input. Schema di uso: StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) System.out.println(st.nextToken()); visualizza l’output seguente: this is a test Disegno di figure geometriche Per disegnare figure geometriche come rettangoli ed ellissi usare il metodo draw(…) o fill(…) della classe Graphics2D. Ad esempio, se g2D è un riferimento a un oggetto Graphics2D, si può invocare g2D.draw(new Rectangle2D.Double(x, y, w, h)), con ovvio significato dei parametri. Per costruire figure geometriche sono disponibili le seguenti classi (elenco parziale): nome classe Rectangle2D.Double import java.awt.geom.Rectangle2D descrizione rettangolo isotetico Ellipse2D.Double java.awt.geom.Ellipse2D ellisse ad assi isotetici QuadCurve2D.Double java.awt.geom.QuadCurve2D segmento di curva parametri costruttore x, y, width, height il rettangolo isotetico circoscrivente (x, y, width, height) x1, y1, ctrlx, Line2D.Double java.awt.geom.Line2D quadratica che si estende da (x1, y1) a (x2, y2), avente punto di controllo (ctrlx, ctrly) segmento di linea ctrly, x2, y2 x1, y1, x2, y2 Esercitazione pratica Scrivere un’applet che consenta all’utente di confrontare visivamente due colori, definiti attraverso le loro componenti RGB e α (trasparenza). L’applet chiede all’utente, attraverso una finestra di dialogo, di inserire i quattro parametri di ciascuno dei due colori da confrontare. Quindi, vengono mostrati due rettangoli pieni, parzialmente sovrapposti, riempiti con i due colori specificati dall’utente. Lo schema dell’applet cui occorre ispirarsi è illustrato in figura. In particolare, si consiglia di inserire nel metodo init la logica necessaria per acquisire informazioni sui colori e per creare i due rettangoli specificati e in paint quella per la loro visualizzazione. Le variabili di classe/istanza possono essere utili per memorizzare le informazioni sui colori e sui due rettangoli da visualizzare.