Προγραµµατισµός ΙΙ Java 2 Γραφικά Γραφικά Τα γραφικά µπορούν να προσαρτηθούν τόσο σε προγράµµατα που υποστηρίζουν γραφικό περιβάλλον εργασίας: Σε µικροεφαρµογές Σε παραθυρικές εφαρµογές Και ΟΧΙ σε εφαρµογές γραµµής εντολών Ο πρωταρχικός και απλούστερος τρόπος για εισαγωγή γραφικών γίνεται µε χρήση των µεθόδων της κλάσης java.awt.graphics και γενικότερα µε τις κλάσεις του πακέτου java.awt.* Παρακάτω θα µελετήσουµε τα γραφικά µέσα από µικροεφαρµογές 1
Γραφικά µέσω Παραδείγµατος import java.applet.*; import java.awt.*; public class Map extends Applet { public void paint(graphics screen) { // Ορισµός Γραµµατοσειράς (Τύπος, Στύλ, Μέγεθος) Font f = new Font( TimesRoman, Font.BOLD, 36); screen.setfont(f); // Ορισµός χρώµατος της τρέχουσας πένας που ζωγραφίζουµε, χρησιµοποιούµε το έτοιµο χρώµα Color.red (ιδιότητα red της κλάσης Color) screen.setcolor(color.red); // Ζωγραφίζεται το String Florida στη θέση (185, 75) του καµβά της µικροεφαρµογής µας screen.drawstring("florida", 185, 75); // Ορισµός χρώµατος της τρέχουσας πένας που ζωγραφίζουµε, χρησιµοποιούµε χρώµα της επιλογής µας µε (Red, Green, Blue) Color c1 = new Color(255,204,102); screen.setcolor(c1); Γραφικά µέσω Παραδείγµατος Αντίστοιχα, µέσα στην paint() θα µπορούσαµε να καλέσουµε κι άλλες µεθόδους ζωγραφικής όπως: Ορισµός χρώµατος καµβά (υπόβαθρο) screen.setbackground(color.white); Ζωγραφική γραµµής από (x1,y1) σε (x2,y2) screen.drawline(x1,y1,x2,y2); Ζωγραφική ορθογωνίου screen.drawrect(x1,y1,width,height); Ζωγραφική γεµάτου ορθογωνίου screen.fillrect(x1,y1,width,height); Ζωγραφική στρογγυλεµένου ορθογωνίου screen.drawroundrect(x1,y1,width,height); Ζωγραφική ελλείψεων screen.drawoval(x1,y1,width,height); Ζωγραφική γεµάτων ελλείψεων screen.filloval(x1,y1,width,height); 2
Γραφικά µέσω Παραδείγµατος Αντίστοιχα, µέσα στην paint() θα µπορούσαµε να καλέσουµε κι άλλες µεθόδους ζωγραφικής όπως: Ζωγραφική τόξων (κοµµάτι έλλειψης) screen.drawarc(x1,y1,width,height,start_angle,arcs_ degrees); Ζωγραφική γεµάτων τόξων screen.drawarc(x1,y1,width,height,start_angle,arcs_ degrees); Πολύγωνα δίδοντας τα σηµεία των γωνιών του σε ξεχωριστούς πίνακες int x[] = { 10, 20, 30, 40; int y[] = { 15, 25, 35, 45; int points = x.length; Polygon p = new p(x, y, points); Ολοκληρωµένο Παράδειγµα import java.applet.*; import java.awt.*; public class Map extends Applet { public void paint(graphics screen) { screen.drawstring("florida", 185, 75); screen.drawline(185,80,222,80); screen.drawrect(2, 2, 345, 345); screen.drawroundrect(182,61,43,24,10,8); int x[] = { 10, 234, 253, 261, 344, 336, 295, 259, 205, 211, 195, 191, 120, 94, 81, 12, 10 ; int y[] = { 12, 15, 25, 71, 209, 278, 310, 274, 188, 171, 174, 118, 56, 68, 49, 37, 12 ; int pts = x.length; Polygon poly = new Polygon(x, y, pts); screen.drawpolygon(poly); 3
Ολοκληρωµένο Παράδειγµα screen.filloval(235,140,15,15); screen.filloval(225,130,15,15); screen.filloval(245,130,15,15); for (int ax = 50; ax < 150; ax += 10) for (int ay = 120; ay < 320 ; ay += 10) screen.drawarc(ax, ay, 10, 10, 0, -180); Ολοκληρωµένο Παράδειγµα 4
Προχωρηµένα Γραφικά Πιο ωραία γραφική σχεδίαση µπορεί να επιτευχθεί µε τις κλάσεις Java2D Περιλαµβάνονται: Ειδικά µοτίβα σχεδίασης Πένες διαφορετικού πλάτους και στύλ Εξοµάλυνση των πλευρών των σχεδιαζοµένων σχηµάτων (anti-aliasing) Προσοχή! Τα ορίσµατα των σχηµάτων π.χ. Συντεταγµένες ορίζονται στη Java2D µε ακρίβεια float ή double π.χ. Ellipse2D.Float(x1,y1,width,height); Χρήση των Κλάσεων Java2D Πρόβληµα Η paint(graphics screen) λαµβάνει ως όρισµα το αντικείµενο screen της κλάσης Graphics Εµείς για να σχεδιάσουµε µε τις κλάσεις Java2D πρέπει να χρησιµοποιήσουµε την κλάση Graphics2D αντί για τη Graphics. Γι αυτό χρησιµοποιούµε µετατροπή cast: Graphics2D screen2d = (Graphics2D)screen; 5
Χρήση των Κλάσεων Java2D Παράδειγµα: import java.awt.*; public class Map2D extends java.applet.applet { public void paint(graphics screen) { Graphics2D screen2d = (Graphics2D)screen; setbackground(color.blue); // Draw waves screen2d.setcolor(color.white); Χρήση των Κλάσεων Java2D Παράδειγµα (συνέχεια): // Ορισµός της τρέχουσας πένας µέσω της κλάσης BasicStroke // η οποία λαµβάνει ως ορίσµατα τα εξής: // float πλάτος γραµµής π.χ. 2F // int τελείωµα γραµµής π.χ. CAP_BUTT // int στύλ ενώµατος δύο ευθυγράµµων τµηµάτων π.χ. JOIN_ROUND BasicStroke pen = new BasicStroke(2F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); screen2d.setstroke(pen); 6
Χρήση των Κλάσεων Java2D Παράδειγµα (συνέχεια): // Ζωγραφική έλλειψης µε ακρίβεια float // Η Ellipse2D ανήκει στο πακέτο java.awt.geom.* Ellipse2d.Float ee = new Ellipse2D.Float(113F, 25F, 22F, 40F); // Ζωγραφική γεµάτης έλλειψης screen2d.fill(ee); // Ζωγραφική άδειας έλλειψης screen2d.draw(ee); Άνοιγµα Εικόνας από Αρχείο Άνοιγµα εικόνας.gif ή.jpg σε µικροεφαρµογές Μέθοδος Κατασκευάζουµε µια µικροεφαρµογή ιαβάζουµε την εικόνα µε τη µέθοδο getimage(); της κλάσης Applet και αποθηκεύεται ως αντικείµενο Image Εµφανίζουµε το αντικείµενο Image µε τη µέθοδο drawimage(); της κλάσης Graphics 7
Άνοιγµα Εικόνας από Αρχείο Η µέθοδος getimage() Image i = getimage(µονοπάτι_στο_δίσκο, όνοµα_αρχείου_εικόνας); Image i = getimage(getcodebase(), myimage ); // τρέχον µονοπάτι κώδικα Image i = getimage(getdocumentbase(), myimage ); // τρέχον µονοπάτι ιστοσελίδας Άνοιγµα Εικόνας από Αρχείο Η µέθοδος drawimage() Graphics screen.drawimage(image i, int x, int y, this); Graphics screen.drawimage(image i, int x, int y, int width, int height, this); 8
Άνοιγµα Εικόνας από Αρχείο Παράδειγµα import java.awt.graphics; import java.awt.image; public class Fillmore extends java.applet.applet { Image whig; public void init() { whig = getimage(getcodebase(), "images/fillmore.jpg"); Άνοιγµα Εικόνας από Αρχείο Παράδειγµα (συνέχεια) public void paint(graphics screen) { int iwidth = whig.getwidth(this); int iheight = whig.getheight(this); int xpos = 10; // 25% screen.drawimage(whig, xpos, 10, iwidth / 4, iheight / 4, this); // 100% xpos += (iwidth / 4) + 10; screen.drawimage(whig, xpos, 10, this); 9
Άνοιγµα Εικόνας από Αρχείο Το αποτέλεσµα του παραδείγµατος 10