Γραφικές ιεπαφές Χρήστη και Γραφικά



Σχετικά έγγραφα
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

Week 10: Graphical User Interfaces

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

ημιουργία Γραφικού Περιβάλλοντος

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #17

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 12 : ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ GUI AWT ΚΑΙ

Ειδικά Θέματα Προγραμματισμού

Week 12: GUIs with Swing

Εργαστήριο 2 - Άσκηση - Ανάλυση

9.1 JFC Swing. 9.1 JFC Swing Java (GUI) Java. Java Foundation Classes (JFC) Swing GUI. JFC Card Pile GameFrame GUI

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #18

Οντοκεντρικός Προγραμματισμός

java.awt Font Γραµµατοσειρές Color Χρώµατα

VK -14/10/2016 Σελίς 1

6.1 Εισαγωγή. 6.2 Ασφάλεια

Εισαγωγή. Κεφάλαιο 2: Βασικές έννοιες Java Κεφάλαιο 3: Χρήση της Java στις σελίδες σας Κεφάλαιο 4: Οι πρώτες σας μικροεφαρμογές...

8.1 Top-Level Swing Containers και Swing Components

7. Ανάπτυξη GUI σε Java

VK -14/10/2016 Σελίς 1

Αντικειµενοστρεφής Προγραµµατισµός

Κλάσεις και Αντικείµενα

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ηµιουργία ιαλογικών Προγραµµάτων για το Web

Περιεχόµενα. Πρόλογος...15

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

3D FLASH ANIMATOR (3DFA)

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

Λίγα λόγια από το συγγραφέα Microsoft Word Δημιουργία νέου εγγράφου Το σύστημα Βοήθειας του Word...

ΑΛΛΗΛΕΠΙ ΡΑΣΗ ΑΝΘΡΩΠΟΥ ΜΗΧΑΝΗΣ 2 o ΕΡΓΑΣΤΗΡΙO

Εργαστήριο #12. Βήμα 1 ο. Βήμα 2 ο. Βήμα 3 ο. Βήμα 4 ο.

ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ. Η Γλώσσα Προγραµµατισµού Java

TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο)

Μέρος ΙΙ Εφαρμογές γραφικών με το πακέτο swing - 5. Περιεχόμενα

Ειδικά Θέματα Προγραμματισμού

2.1. Εντολές Σχόλια Τύποι Δεδομένων

> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό

ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΣΕ ΔΙΣΚΕΤΑ ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΑΠΟ ΔΙΣΚΕΤΑ. Από τον κατάλογο που εμφανίζεται επιλέγω: Αποστολή προς Δισκέτα (3,5)

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

ΓΡΑΦΙΚΕΣ ΔΙΕΠΑΦΕΣ ΧΡΗΣΤΗ- SWING (1)

ζωγραφίζοντας µε τον υπολογιστή

ιαµόρφωση σελίδας Προεπισκόπηση Εκτύπωση

Λεπτομέριες τοιχοποιίας Σχεδίαση κάτοψης

0 SOLID_LINE 1 DOTTED_LINE 2 CENTER_LINE 3 DASHED_LINE 4 USERBIT_LINE

Πρακτικές οδηγίες για την Επεξεργασία Κειμένου

Microsoft Excel Κεφάλαιο 1. Εισαγωγή. Βιβλίο εργασίας

Πίνακες, περιγράµµατα και σκίαση

A3.3 Γραφικά Περιβάλλοντα Επικοινωνίας και Διαχείριση Παραθύρων

2.1 Αντικειµενοστρεφής προγραµµατισµός

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

3 ο Εργαστήριο Μεταβλητές, Τελεστές

5.1.1 Περιγραφή των συστατικών τμημάτων ενός γραφήματος

MICROSOFT OFFICE 2003

Πρακτικές συμβουλές κατά την πληκτρολόγηση ., ; :! ( ) " " Άνοιγμα και αποθήκευση εγγράφου Αρχείο, Άνοιγμα. Αρχείο / Αποθήκευση

Εισαγωγή στο Libre Office. Bάιος Κολοφωτιάς Επιστημονικός Συνεργάτης Sweng Lab A.Π.Θ

Γενικό Λύκειο Κρουσώνα - Σχολικό έτος Εκπαιδευτικός: Παπαδάκης Σταµάτης

1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα

Περιεχόμενα ΜΕΡΟΣ ΠΡΩΤΟ. Πρόλογος... 13

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Προγραμματισμός Διαδικτύου

Δημιουργώντας μια εφαρμογή ζωγραφικής. 2 η Εργασία

10.1 Γενικά για τα streams

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Βιοϊατρική τεχνολογία

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2008 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Περιεχόμενα. Πρόλογος 15

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Οπτικός Προγραμματισμός σε NetBeans με Java Swing

Δημιουργία ενός κενού πίνακα

Φύλλο Εργασίας Τίτλος: Εισαγωγική Εφαρμογή

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

Προγραμματισμός Διαδικτύου

MEDIWARE L.I.S ΟΔΗΓΙΕΣ ΥΠΟΠΡΟΓΡΑΜΜΑΤΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΠΙΣΚΕΨΕΩΝ

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Εισαγωγή στο πρόγραμμα Microsoft word 2003

Εργαστήριο 3 - Άσκηση - Ανάλυση

Γνωριµία µε τη Microsoft Access

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

Σχήµα 2.1: Εισαγωγή array στο Front Panel.

Τα Windows Πολύ Απλά και Πολύ Σύντομα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Word 3: Δημιουργία πίνακα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

HelloApplet. Παύλος Εφραιμίδης Java Applets 1

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιασύνδεση µε χρήστη: Swing ΙΙ. Window Listeners

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites

Εισαγωγή στον Προγραμματισμό

ΕΡΩΤΗΣΕΙΣ στην επεξεργασία κειμένου (Word)

ΤΟ ΠΕΡΙΒΑΛΛΟΝ ΤΗΣ. Εργαλειοθήκη Παρουσιάζετε το έργο σας Εκκινείτε τα σενάριά σας Σταματάτε όλα τα σενάρια. Οι 8 ομάδες της Παλέτας εντολών

04. Μορφοποίηση περιεχομένων σχεδίου & σύνθετα εργαλεία σχεδίασης

Άσκηση 5 Ανύψωση Σχηµάτων. Στόχος της άσκησης

Εγχειρίδιο Χρήσης του «Μαθη.Συ.»

Create Sprite at Runtime

App Inventor 8ο Μάθημα (Ζωγραφική με τα δάχτυλα)

Περιεχόµενα. Λίγα λόγια από τους συγγραφείς...9. Για τον εκπαιδευτή και το γονέα Αριθµοί και Υπολογισµοί (Numbers and Calculations)

Transcript:

Κεφάλαιο 18 Γραφικές ιεπαφές Χρήστη και Γραφικά Νοηµοσύνη είναι η ικανότητα να δηµιουργούµε τεχνητά αντικείµενα, ιδιαίτερα εργαλεία που φτιάχνουν εργαλεία. Henri Bergson Η ζωγραφική είναι µόνο µια γέφυρα που συνδέει το νου του ζωγράφου µε αυτόν του θεατή. Eugène Delacroix Μια εικόνα αξίζει όσο δέκα χιλιάδες λέξεις. Κινέζικη παροιµία Υπερβολή είναι να ζωγραφίζεις ένα φίδι και να του προσθέτεις πόδια. Παροιµία 18.1 Εισαγωγή Όλες οι εφαρµογές που εξετάσαµε µέχρι τώρα έπαιρναν την είσοδό τους είτε από τη γραµµή των εντολών είτε από το πληκτρολόγιο και εµφάνιζαν την έξοδό τους στην οθόνη µε απλό τρόπο. Η Java διαθέτει τα πακέτα java.awt, δηλαδή την εργαλειοθήκη αφηρηµένων παραθύρων (abstract window toolkit), και javax.swing που περιέχουν όλες τις τάξεις και τις διεπαφές, τα µέλη των οποίων βοηθούν τους προγραµµατιστές να ορίζουν Γραφικές ιεπαφές Χρήστη-Γ Χ (Graphical User Interfaces-GUIs) και να σχεδιάζουν γραφικά για τις εφαρµογές ή τις µικροεφαρµογές τους (βλ. Κεφ. 20). Οι Γ Χ κάνουν ευκολότερη την είσοδο των δεδοµένων και την εµφάνιση των αποτελεσµάτων σε διάφορα παράθυρα στην οθόνη. Γ Χ κτίζονται από συνθετικά µέρη (components) ή συστατικά που ονοµάζονται µερικές φορές µηχανηµατάκια των παραθύρων (window gadgets). Ένα συστατικό µιας Γ Χ είναι ένα αντικείµενο µε το οποίο ο χρήστης πιθανώς αλληλεπιδρά µέσω του ποντικιού, του πληκτρολογίου ή κάποιου άλλου τρόπου εισαγωγής δεδοµένων, για παράδειγµα µέσω αναγνώρισης φωνής. Τα συστατικά µιας Γραφικής ιεπαφής Χρήστη (Γ Χ) διευκολύνουν την είσοδο των δεδοµένων και τη µορφοποίηση ή την αναπαράσταση των αποτελεσµάτων που εµφανίζονται στην οθόνη. Μια τυπική τέτοια εµφάνιση περιέχει συνήθως: ένα παράθυρο µε µια ράβδο τίτλου (title bar), κουµπιά (buttons), τα οποία ο χρήστης 493

494 Προγραµµατισµός µε Java µπορεί να πιέσει µε το ποντίκι, ένα ή περισσότερα πεδία κειµένου (text fields), µέσα στα οπoία ο χρήστης µπορεί να πληκτρολογήσει κάποιο κείµενο, και πιθανώς ένα ή περισσότερα µενού, τα περιεχόµενα των οποίων µπορεί ο χρήστης να επιλέξει µε το ποντίκι ή το πληκτρολόγιο. Τα συστατικά που παρέχει το πακέτο java.awt θεωρούνται βαριά (heavyweight), µε την έννοια ότι εµφανίζονται µε διαφορετικό τρόπο στις διάφορες πλατφόρµες συστηµάτων. Σε αντίθεση, το πακέτο javax.swing περιέχει ένα σύνολο από ελαφρά συστατικά (lightweight components) που είναι σχεδόν όλα γραµµένα στην ίδια την Java και τα οποία, στο µεγαλύτερο δυνατό βαθµό, συµπεριφέρονται µε τον ίδιο τρόπο σ όλες τις πλατφόρµες υλισµικού και λειτουργικών συστηµάτων. Η παρακάτω ιεραρχία δείχνει τη συγγένεια µερικών από τις τάξεις των πακέτων java.awt και javax.swing. Με έντονα έχουν σηµειωθεί οι τάξεις που θα περιγράψουµε στο κεφάλαιο αυτό, καθώς και στο Κεφάλαιο 20. java.lang.object java.awt.component java.awt.container java.awt.window java.awt.frame javax.swing.jframe javax.swing.jcomponent javax.swing.jlabel javax.swing.jtextcomponent javax.swing.jtextfield javax.swing.jtextarea javax.swing.abstractbutton javax.swing.jbutton javax.swing.jpanel javax.swing.joptionpane javax.swing.jscrollpane java.awt.dialog javax.swing.jdialog java.awt.graphics java.awt.color java.awt.font java.awt.fontmetrics java.awt.panel java.applet.applet javax.swing.japplet Πίνακας 18.1. Μερική ιεραρχία τάξεων των πακέτων java.awt και javax.swing.

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 495 18.2 Συστατικά: τάξη java.awt.component Η τάξη Component ορίζει όλες τις κοινές ιδιότητες και συµπεριφορές όλων των υποτάξεών της. Περιέχει µεθόδους που προσδιορίζουν το µέγεθος ενός συστατικού, το αν είναι ορατό ή όχι, τη γραµµατοσειρά των χαρακτήρων του, το χρώµα του και πιθανώς και κάποιους τρόπους µε τους οποίους αυτό µπορεί να ανταποκριθεί σε γεγονότα. Μερικές από τις µεθόδους τις τάξης Component είναι: public void setlocation (int x, int y) µετακινεί το συστατικό. Η νέα θέση της πάνω αριστερής γωνίας του δίνεται από τις συντεταγµένες x και y public void setbounds (int x, int y, int πλάτος, int ύψος) µετακινεί και αλλάζει το µέγεθος του συστατικού. Η νέα θέση της πάνω αριστερής γωνίας του δίνεται από τις συντεταγµένες x και y, ενώ το νέο του µέγεθος προσδιορίζεται από τις παραµέτρους πλάτος και ύψος public void setsize (int πλάτος, int ύψος) αλλάζει το µέγεθος του συστατικού, έτσι ώστε αυτό να έχει πλάτος πλάτος και ύψος ύψος public void setfont (Font f) προσδιορίζει τη µορφή της γραµµατοσειράς του συστατικού. Αν η παράµετρος f είναι ίση µε null, τότε το συστατικό κληρονοµεί τη µορφή της γραµµατοσειράς του γονικού του συστατικού public void setforeground (Color c) προσδιορίζει το προσκηνιακό χρώµα του συστατικού. Αν η παράµετρος c είναι ίση µε null, τότε το συστατικό κληρονοµεί το προσκηνιακό χρώµα του γονικού του συστατικού public void setbackground (Color c) προσδιορίζει το παρασκηνιακό χρώµα του συστατικού. Αν η παράµετρος c είναι ίση µε null, τότε το συστατικό κληρονοµεί το παρασκηνιακό χρώµα του γονικού του συστατικού public void setvisible (boolean b) κάνει ορατό ή αόρατο (εµφανίζει ή κρύβει) το συστατικό, ανάλογα µε το αν η τιµή της παραµέτρου b είναι ίση µε true ή false αντίστοιχα public void addkeylistener (KeyListener l)

496 Προγραµµατισµός µε Java προσθέτει τον ακροατή l για να ακούει γεγονότα του πληκτρολογίου από το συστατικό αυτό (βλ. Κεφ. 19.5.1). Αν η παράµετρος l είναι null δε γίνεται τίποτα και δε ρίχνεται καµία εξαίρεση public void addmouselistener (MouseListener l) προσθέτει τον ακροατή l για να ακούει γεγονότα του ποντικιού από το συστατικό αυτό (βλ. Κεφ. 19.6.1 και 19.6.2). Αν η παράµετρος l είναι null δε γίνεται τίποτα και δε ρίχνεται καµία εξαίρεση public void addmousemotionlistener (MouseMotionListener l) προσθέτει τον ακροατή l για να ακούει γεγονότα κίνησης του ποντικιού από το συστατικό αυτό (βλ. Κεφ. 19.6.1 και 19.6.3). Αν η παράµετρος l είναι null δε γίνεται τίποτα και δε ρίχνεται καµία εξαίρεση public void paint (Graphics g) ζωγραφίζει το συστατικό. Η µέθοδος αυτή καλείται αυτόµατα από το σύστηµα όταν το συστατικό πρέπει να ζωγραφιστεί, για παράδειγµα όταν αυτό εµφανίζεται για πρώτη φορά ή όταν αυτό έχει καταστραφεί και χρειάζεται να διορθωθεί. Παίρνει ως παράµετρο µια αναφορά της αφηρηµένης τάξης Graphics του πακέτου java.awt, η οποία προσδιορίζει την περιοχή στην οποία πρέπει να ζωγραφιστεί το συστατικό (βλ. και Κεφ. 18.7, παρακάτω). Εφόσον η µέθοδος paint καλείται αυτόµατα από το σύστηµα, πολύ σπάνια χρειάζεται να κληθεί άµεσα από τον προγραµµατιστή συνήθως ακυρώνεται από αυτόν. Αν ο προγραµµατιστής επιθυµεί να ξαναζωγραφίσει το συστατικό, τότε καλεί τη µέθοδο repaint() (βλ. παρακάτω) public void repaint () ξαναζωγραφίζει το συστατικό. Αν το συστατικό είναι ελαφρύ, τότε η κλήση της µεθόδου αυτής προκαλεί την κλήση της µεθόδου paint του συστατικού το συντοµότερο δυνατόν. ιαφορετικά αν το συστατικό είναι βαρύ η κλήση της µεθόδου αυτής προκαλεί την κλήση της µεθόδου update του συστατικού το συντοµότερο δυνατόν και public void update (Graphics g) ενηµερώνει το συστατικό. Αν το συστατικό είναι βαρύ, τότε η κλήση της µεθόδου update είναι το αποτέλεσµα µιας κλήσης της µεθόδου repaint. Η µέθοδος update καλεί τη µέθοδο paint του συστατικού για να ξανασχεδιάσει το συστατικό. Παίρνει ως παράµετρο µια αναφορά της αφηρηµένης τάξης Graphics, η οποία προσδιορίζει την περιοχή σχεδίασης του συστατικού. Όπως και η µέθοδος paint, έτσι και η µέθοδος update πολύ σπάνια χρειάζεται να κληθεί άµεσα από

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 497 τον προγραµµατιστή, αν και η τελευταία µπορεί να ακυρωθεί για να ελαττώσει το τρεµοπαίξιµο κινούµενων γραφικών. 18.3 Υποδοχείς: Τάξη java.awt.container Ένα περιέχον µέρος (container) ή υποδοχέας είναι µια συλλογή από σχετικά συνθετικά µέρη ή συστατικά. Όπως µια τάξη που κληρονοµεί την τάξη Component είναι ένα συστατικό, έτσι και µια τάξη που κληρονοµεί την τάξη Container είναι ένας υποδοχέας. Εξετάζοντας την ιεραρχία του Πίνακα 18.1, θα διαπιστώσουµε ότι ένα αντικείµενο της τάξης Container (ένας υποδοχέας) είναι ένα αντικείµενο της τάξης Component (ένα συστατικό). Μ άλλα λόγια οι υποδοχείς είναι και αυτοί συστατικά, δηλαδή αντικείµενα της υποτάξης Container της τάξης Component του πακέτου java.awt. Έτσι, οι υποδοχείς όπως κι όλα τα άλλα συστατικά µπορούν να προστεθούν σ έναν άλλο υποδοχέα, δίνοντας µας τη δυνατότητα να δηµιουργήσουµε σύνθετες Γ Χ. Κάθε πρόγραµµα που παρέχει µια Γ Χ τύπου Swing πρέπει να περιέχει έναν τουλάχιστον βασικό (ριζικό, πρώτου επιπέδου) υποδοχέα του Swing, που υποστηρίζει τον τρόπο µε τον οποίο τα συστατικά του υποδοχέα σχεδιάζονται και αντιδρούν σε γεγονότα. Οι τρεις βασικοί υποδοχείς του Swing είναι αντικείµενα των τάξεων: JFrame υλοποιεί πλαίσιο, δηλαδή ένα κύριο παράθυρο JApplet υλοποιεί την περιοχή εµφάνισης µιας µικροεφαρµογής µέσα στο παράθυρο ενός φυλλοµετρητή και JDialog υλοποιεί ένα δευτερεύον παράθυρο, δηλαδή ένα παράθυρο που εξαρτάται από ένα άλλο παράθυρο. Οι υποδοχείς του Swing θεωρούνται ότι αποτελούνται από υαλοπίνακες (panes) 1. Στο βιβλίο αυτό θα ασχοληθούµε µόνο µε τους υποδοχείς JFrame, JPanel (Κεφ. 18.6) και JApplet (Κεφ. 20). Οι υποδοχείς JFrame και JApplet διαθέτουν έναν ειδικό υποδοχέα τον υαλοπίνακα των περιεχοµένων (content pane) τους. Τα συστατικά που περιέχονται στον υαλοπίνακα αυτόν εµφανίζονται αυτόµατα στην οθόνη κατά τη διάρκεια εκτέλεσης του προγράµµατος. Ο υαλοπίνακας περιεχοµένων είναι ένα αντικείµενο της τάξης Container του πακέτου java.awt. Έτσι, στις εφαρµογές που επεκτείνουν τον υποδοχέα JFrame -και στις µικροεφαρµογές (που επεκτείνουν τον υποδοχέα JApplet)-, τα συ- 1 Κάτι που χονδρικά σηµαίνει υποδοχείς µέσα σε υποδοχείς.

498 Προγραµµατισµός µε Java στατικά πρέπει να προστίθενται στον υαλοπίνακα περιεχοµένων του υποδοχέα. Αυτός είναι ένα αντικείµενο της τάξης Container. Η τάξη java.awt.container ορίζει όλες τις κοινές ιδιότητες και συµπεριφορές των αντικειµένων όλων των υποτάξεών της. Κληρονοµεί τις µεθόδους setsize και setvisible από την τάξη java.awt.component. Μερικές από τις άλλες µεθόδους της τάξης αυτής είναι: public Component add (Component συστατικό) προσθέτει το συστατικό συστατικό (συστατικό ή υποδοχέα) σ έναν υποδοχέα public void setlayout (διαχειριστής_διάταξης) προσδιορίζει το διαχειριστή διάταξης (layout manager) ο οποίος δίνει κατάλληλες διαστάσεις στα συστατικά µέρη του υποδοχέα και τα τοποθετεί σ ορισµένες θέσεις στην οθόνη, απαλλάσσοντας τον προγραµµατιστή από το να καθορίσει ο ίδιος τις λεπτοµέρειες αυτές. Η παράµετρος διαχειριστής_διάταξης είναι τύπου LayoutManager (βλ. Κεφ. 18.5, παρακάτω). Αν η παράµετρος αυτή είναι ίση µε null, τότε ο διαχειριστής_διάταξης θεωρείται ως απόλυτος (absolute) και ο χρήστης πρέπει να προδιαγράψει τα όρια (bounds) κάθε συστατικού µε τη µέθοδο setbounds που η τάξη java.awt.container κληρονοµεί από την τάξη java.awt.component public void paint (Graphics g) ζωγραφίζει τον υποδοχέα αυτόν. Για παράδειγµα, αν ο χρήστης καλύψει το παράθυρο ενός υποδοχέα στην οθόνη µ ένα άλλο ανοικτό παράθυρο και αργότερα ξεσκεπάσει το παράθυρο του υποδοχέα, τότε καλείται αυτόµατα η µέθοδος paint. Παίρνει ως παράµετρο µια αναφορά της τάξης Graphics του πακέτου java.awt η οποία παριστάνει την περιοχή που πρέπει να ζωγραφιστεί. Τέλος τάξη Container κληρονοµεί τη µέθοδο repaint() της τάξης Component και ακυρώνει τη µέθοδο update (Graphics g), έτσι ώστε αυτή να ενηµερώνει τον υποδοχέα. 18.3.1 Πλαίσια: Τάξη JFrame Τα προγράµµατα χρησιµοποιούν συχνά ένα αντικείµενο τύπου JFrame για να δηµιουργήσουν εφαρµογές βασισµένες σε Γ Χ. Το αντικείµενο αυτό παρέχει το χώρο µέσα στον οποίο εµφανίζεται η Γ Χ. Η τάξη JFrame παρέχει τις βασικές ιδιότητες και συµπεριφορές ενός παραθύρου, δηλαδή µια µπάρα τίτλου και κου- µπιά για ελαχιστοποίηση, µεγιστοποίηση και κλείσιµο του παραθύρου. Οι κατασκευαστές της τάξης JFrame είναι:

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 499 public JFrame () κατασκευάζει ένα νέο πλαίσιο που είναι αρχικά αόρατο και public JFrame (String συµβολοσειρά) κατασκευάζει ένα νέο πλαίσιο που είναι αρχικά αόρατο και έχει ως τίτλο τη συµβολοσειρά. Μερικές από τις µεθόδους της τάξης JFrame είναι: public void settitle (String συµβολοσειρά) θέτει τη συµβολοσειρά σαν τίτλο του πλαισίου public String gettitle () επιστρέφει τον τίτλο του πλαισίου ως µια συµβολοσειρά public Container getcontentpane () επιστρέφει το αντικείµενο υαλοπίνακα των περιεχοµένων του πλαισίου αυτού public void setdefaultcloseoperation (int πράξη) προσδιορίζει την πράξη που εξ ορισµού θα λάβει χώρα όταν ο χρήστης κλείσει το πλαίσιο, δηλαδή πατήσει το κουµπί x που βρίσκεται στην πάνω δεξιά γωνία της ράβδου µενού του πλαισίου. Πιθανές ενέργειες είναι: JFrame.EXIT_ON_CLOSE η εφαρµογή τερµατίζεται καλώντας τη µέθοδο System.exit (η σταθερά αυτή πρέπει να χρησιµοποιείται µόνο για εφαρµογές) WindowConstants.DO_NOTHING_ON_CLOSE δεν κάνει τίποτα. Το γεγονός του κλεισίµατος του πλαισίου πρέπει να το χειριστεί το ίδιο το πρόγραµµα WindowConstants.HIDE_ON_CLOSE το πλαίσιο κρύβεται αυτόµατα, για να εµφανιστεί πιθανώς αργότερα WindowConstants.DISPOSE_ON_CLOSE το πλαίσιο κρύβεται και καταστρέφεται αυτόµατα (µετά από αυτό δεν είναι δυνατόν να ξαναεµφανιστεί). Ένα πλαίσιο κληρονοµεί τις µεθόδους setvisible, setsize, setlocation και repaint από την τάξη java.awt.component, καθώς και τη µέθοδο paint από την τάξη java.awt.container. Η τελευταία πρέπει να ακυρωθεί για να σχεδιάσουµε άµεσα στο παρασκήνιο του πλαισίου. Τέλος ένα πλαίσιο ακυρώνει τη µέθοδο update της τάξης Container, έτσι ώστε η τελευταία α- πλώς να καλεί τη µέθοδο paint(g) που κληρονοµείται από την τάξη Container.

500 Προγραµµατισµός µε Java 18.4 Συστατικά του swing: τάξη javax.swing.jcomponent Η αφηρηµένη τάξη JComponent είναι η υπερτάξη των περισσοτέρων συστατικών του πακέτου swing, τα ονόµατα των οποίων αρχίζουν µε το γράµµα 'J'. Στα παρακάτω θα εξετάσουµε µερικά από τα βασικά συστατικά που παρέχει η τάξη JComponent του πακέτου javax.swing. Οι υποτάξεις της τάξης JComponent υποστηρίζουν διαφάνεια (transparency). Μερικές από τις µεθόδους της τάξης JComponent είναι: public boolean setopaque (boolean b) καθιστά το συστατικό αδιαφανές, αν η παράµετρος b είναι true, και διαφανές, αν είναι false public void settooltiptext (String κείµενο) προσδιορίζει το κείµενο που θα εµφανιστεί, όταν ο δείκτης του ποντικιού παρα- µείνει για λίγο χρόνο πάνω στο συστατικό αυτό. 18.4.1 Ετικέτες: Τάξη JLabel Μια ετικέτα (label) είναι µια περιοχή στην οποία µπορεί να εµφανιστεί ένα σύντοµο κείµενο, µια εικόνα ή και τα δύο. Αρκετές φορές τοποθετείται δίπλα σε κάποιο άλλο συστατικό Γ Χ και περιέχει µια συµβολοσειρά ή και µια εικόνα που χρησιµοποιείται για να υποδεικνύει το σκοπό του τελευταίου. Κάθε ετικέτα έχει µια περιοχή εµφάνισης. Μερικοί από τους κατασκευαστές της τάξης JLabel είναι: public JLabel () δηµιουργεί µια νέα κενή δεν περιέχει ούτε κείµενο ούτε εικόνα ετικέτα που είναι κατακόρυφα κεντραρισµένη µέσα στην περιοχή εµφάνισής της. Μετά τη δηµιουργία της, µπορεί να τοποθετηθεί µία εικόνα (µε τη µέθοδο seticon, βλ. παρακάτω) ή/και κείµενο στην ετικέτα αυτή (µε την εντολή settext, βλ. παρακάτω). Η στοίχιση των (µελλοντικών) περιεχοµένων της (θα) είναι αριστερή. public JLabel (String συµβολοσειρά) δηµιουργεί µια νέα ετικέτα που περιέχει τη συµβολοσειρά. Η ετικέτα είναι στοιχισµένη ως προς την αρχική (leading) άκρη της περιοχής εµφάνισής της και κεντραρισµένη κατακόρυφα µέσα σε αυτήν public JLabel (String συµβολοσειρά, int οριζόντια_στοίχιση)

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 501 δηµιουργεί µια νέα ετικέτα που περιέχει τη συµβολοσειρά. Η ετικέτα είναι κεντραρισµένη κατακόρυφα στην περιοχή εµφάνισής της. Η παράµετρος οριζόντια_στοίχιση είναι τύπου int και µπορεί να πάρει ως τιµή µια από τις παρακάτω σταθερές που είναι ορισµένες στη διεπαφή SwingConstants (που υλοποιεί η τάξη JLabel): Σταθερά Στοίχιση SwingConstants.LEFT προς τ αριστερά SwingConstants.CENTER στο κέντρο SwingConstants.RIGHT προς τα δεξιά SwingConstants.LEADING στην αρχή της περιοχής 2 SwingConstants.TRAILING στο τέλος της περιοχής. public JLabel (Icon εικόνα) δηµιουργεί µια ετικέτα που περιέχει την εικόνα. Η ετικέτα αυτή είναι κατακόρυφα και οριζόντια κεντραρισµένη στην περιοχή εµφάνισής της public JLabel (Icon εικόνα, int οριζόντια_στοίχιση) δηµιουργεί µια ετικέτα µε την εικόνα εικόνα. Η παράµετρος οριζόντια_- στοίχιση καθορίζει την οριζόντια στοίχιση της ετικέτας µέσα στην περιοχή εµφάνισής της και µπορεί να πάρει µια από τις τιµές που προσδιορίστηκαν παραπάνω. Η ετικέτα είναι κατακόρυφα κεντραρισµένη µέσα στην περιοχή εµφάνισής της public JLabel (String συµβολοσειρά, Icon εικόνα, int οριζόντια_στοίχιση) δηµιουργεί µια ετικέτα µε τη συµβολοσειρά, την εικόνα και την οριζόντια_στοίχιση που περνιούνται ως παράµετροι. Η ετικέτα είναι κατακόρυφα κεντραρισµένη µέσα στην περιοχή εµφάνισής της. Το κείµενο είναι στην τελική (trailing) άκρη της εικόνας. Μερικές από τις µεθόδους της τάξης JLabel είναι: public void sethorizontalalignment (int οριζόντια_στοίχιση) θέτει τη στοίχιση του τίτλου της ετικέτας κατά µήκος του άξονα των x, όπου ο- ριζόντια_στοίχιση είναι µια από τις παραπάνω τιµές 2 Με χρήση των σταθερών LEADING και TRAILING η διάταξη των συστατικών του Swing µπορεί να κάνει χρήση ενός αντικειµένου που ονοµάζεται ComponentOrientation (προσανατολισµός συστατικού). Όταν ένα τέτοιο αντικείµενο προσαρτάται σ ένα συστατικό του Swing, τότε η σταθερά LEADING σηµαίνει αριστερά σ ένα αριστερά προς τα δεξιά περιβάλλον (π.χ. ελληνική γλώσσα) και δεξιά σ ένα δεξιά προς αριστερά περιβάλλον (π.χ. αραβική γλώσσα). Το αντίθετο υπονοείται µε τη σταθερά TRAILING.

502 Προγραµµατισµός µε Java public int gethorizontalalignment () επιστρέφει τη στοίχιση του τίτλου της ετικέτας κατά µήκος του άξονα των x, ως µια τιµή από τις παραπάνω public void setverticalalignment (int κατακόρυφη_στοίχιση) θέτει τη στοίχιση του τίτλου της ετικέτας κατά µήκος του άξονα των y. Η παράµετρος κατακόρυφη_στοίχιση µπορεί να πάρει µια από τις παρακάτω τιµές: SwingConstants.TOP στοίχιση στην κορυφή SwingConstants.CENTER SwingConstants.BOTTOM στοίχιση στο κέντρο στοίχιση στη βάση public int getverticalalignment () επιστρέφει τη στοίχιση του τίτλου της ετικέτας κατά µήκος του άξονα των y, ως µια τιµή από τις παραπάνω public void sethorizontaltextposition (int οριζόντια_στοίχιση) µε βάση την τιµή της παραµέτρου οριζόντια_στοίχιση η οποία µπορεί να είναι µια από αυτές που αναφέρθηκαν και παραπάνω, καθορίζει την οριζόντια θέση του κειµένου της ετικέτας σχετικά µε τη θέση της εικόνας της public int gethorizontaltextposition () επιστρέφει τη σχετική µε τη θέση της εικόνας οριζόντια θέση του κειµένου της ετικέτας public void setverticaltextposition (int κατακόρυφη_στοίχιση) καθορίζει την κατακόρυφη θέση του κειµένου της ετικέτας σε σχέση µε τη θέση της εικόνας της. Η παράµετρος κατακόρυφη_στοίχιση µπορεί να πάρει µια από της τιµές που προσδιορίστηκαν παραπάνω public int getverticaltextposition () επιστρέφει τη σχετική µε τη θέση της εικόνας θέση του κειµένου της ετικέτας κατά τον κατακόρυφο άξονα public void settext (String συµβολοσειρά) τοποθετεί τη συµβολοσειρά µέσα στη ετικέτα public String gettext () επιστρέφει τη συµβολοσειρά που περιέχει η ετικέτα

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 503 public void seticon (Icon εικόνα) τοποθετεί την εικόνα µέσα στην ετικέτα public Icon geticon () επιστρέφει την εικόνα που περιέχει η ετικέτα public void setlabelfor (Component συστατικό) θέτει την ετικέτα στο συστατικό. Η παράµετρος συστατικό µπορεί να είναι null, αν η συγκεκριµένη ετικέτα δεν αντιστοιχεί σε κάποιο συστατικό public Component getlabelfor () επιστρέφει το συστατικό στο οποίο αντιστοιχεί η ετικέτα αυτή. Η τιµή που επιστρέφει µπορεί να είναι null, αν η ετικέτα αυτή δεν αντιστοιχεί σε συστατικό. Παράδειγµα 18.1 // κάνει µια επίδειξη της χρήσης συστατικών τύπου JLabel import java.awt.*; import javax.swing.*; public class LabelTestApp extends JFrame { private JLabel label1, label2, label3, label4; private Icon goofy = new ImageIcon ("C:\\goofy.gif"); // στήσε τη Γ Χ public LabelTestApp() { super("πολλές Ετικέτες... "); // πάρε τον υαλοπίνακα των περιεχοµένων του πλαισίου Container c = getcontentpane(); c.setlayout (null); c.setbackground (Color.white); // (βλ. τάξη Color στο Κεφ.18.8, παρακάτω) // κατασκευαστής µε παράµετρο κείµενο label1 = new JLabel("Ετικέτα µε κείµενο"); label1.setbounds (30, 70, 200, 40); label1.setfont (new Font ("Courier new", Font.BOLD, 16)); label1.setbackground (Color.red.brighter()); label1.setforeground (Color.blue); label1.setopaque (true); c.add (label1);

504 Προγραµµατισµός µε Java // κατασκευαστής µε παραµέτρους εικόνα και στοίχιση label2 = new JLabel (goofy, SwingConstants.CENTER); label2.setbounds (250, 20, 200, 140); label2.setbackground (Color.cyan.darker()); label2.setopaque (true); c.add (label2); // κατασκευαστής µε παραµέτρους κείµενο, εικόνα // και στοίχιση label3 = new JLabel("Ετικέτα µε κείµενο και " + "εικόνα", goofy, SwingConstants.LEFT); label3.setbounds (10, 180, 350, 140); label3.setbackground (Color.orange); label3.setopaque (true); c.add (label3); // κατασκευαστής χωρίς παραµέτρους label4 = new JLabel(); // πρόσθεσε κείµενο στην ετικέτα label4.settext ("Ετικέτα µε εικόνα και κείµενο στο" + " κάτω µέρος της"); // πρόσθεσε εικόνα στην ετικέτα label4.seticon (goofy); label4.sethorizontaltextposition (SwingConstants.CENTER); label4.sethorizontalalignment (SwingConstants.CENTER); label4.setverticaltextposition (SwingConstants.BOTTOM); label4.setbackground (Color.green.darker()); label4.setbounds (60, 340, 350, 150); label4.setopaque (true); c.add (label4); setsize (470, 540); // εννοείται this., γιατί οι setvisible (true); // εντολές αυτές βρίσκονται µέσα // στη µέθοδο-κατασκευαστή του πλαισίου } // LabelTestApp // εκτέλεσε την εφαρµογή public static void main(string args[]) { LabelTestApp application = new LabelTestApp(); application.setdefaultcloseoperation (EXIT_ON_CLOSE);

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 505 } // main } // LabelTestApp Σηµείωση Το αποτέλεσµα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής (βλ. Εικόνα 1), καθώς και όλων των υπόλοιπων εφαρµογών και µικροεφαρµογών των Κεφαλαίων 18, 19, και 20 παρουσιάζονται στο έγχρωµο ένθετο που βρίσκεται στο τέλος του βιβλίου. 18.4.2 Πεδία κειµένου: Τάξη JΤextField Ένα πεδίο κειµένου (text field) είναι ένα συστατικό Γ Χ που χρησιµοποιείται είτε για την εισαγωγή µιας γραµµής κειµένου που πληκτρολογεί ο χρήστης είτε για να εµφανίσει µια γραµµή κειµένου ως έξοδο του προγράµµατος. Η γραµµή κειµένου πληκτρολογείται ή εµφανίζεται µέσα σ ένα ορθογώνιο. Όταν ο χρήστης πιέσει το πλήκτρο Enter (για να στείλει τη συµβολοσειρά που πληκτρολόγησε στο πρόγραµµα), συµβαίνει ένα γεγονός ενεργείας (action event). Αν το πρόγραµµα διαθέτει έναν ακροατή_ενέργειας συνδεδεµένο µε το πεδίο κειµένου, τότε αυτός µπορεί να αντιµετωπίσει το εν λόγω γεγονός. Μερικοί από τους κατασκευαστές της τάξης JTextField είναι οι παρακάτω: public JTextField () δηµιουργεί ένα νέο πεδίο κειµένου που είναι κενό, δηλαδή έχει 0 στήλες και περιέχει την κενή συµβολοσειρά public JTextField (String συµβολοσειρά) δηµιουργεί ένα νέο πεδίο κειµένου και τοποθετεί τη συµβολοσειρά σε αυτό. Ο αριθµός των στηλών του πεδίου τίθεται στο 0 public JTextField (int αριθµός_στηλών) δηµιουργεί ένα νέο κενό πεδίο κειµένου µε αριθµός_στηλών στήλες. public JTextField (String συµβολοσειρά, int αριθµός_στηλών) δηµιουργεί ένα νέο πεδίο κειµένου που περιέχει τη συµβολοσειρά και έχει αριθ- µός_στηλών στήλες. Μερικές από τις µεθόδους της τάξης JTextField είναι: public String gettext () επιστρέφει το κείµενο που βρίσκεται µέσα στο πεδίο κειµένου ως µια συµβολοσειρά

506 Προγραµµατισµός µε Java public void settext (String συµβολοσειρά) θέτει (εµφανίζει) τη συµβολοσειρά στο πεδίο κειµένου. Αν η συµβολοσειρά είναι κενή τότε διαγράφεται το κείµενο που υπήρχε µέσα στο πεδίο κειµένου public void seteditable (boolean b) αν η παράµετρος b είναι ίση µε false, ο χρήστης δεν µπορεί να τροποποιήσει τα περιεχόµενα του αντικειµένου τύπου JTextField. Αντίθετα, αν η b είναι true, τότε ο χρήστης µπορεί να πληκτρολογήσει µέσα στο πεδίο κειµένου public boolean iseditable () επιστρέφει true ή false, ανάλογα µε το αν τα περιεχόµενα του πεδίου κειµένου είναι τροποποιήσιµα public void addactionlistener (ActionListener ακροατής_ενέργειας) προσθέτει τον ακροατή_ενέργειας (βλ. Κεφ. 19.3.3) στο πεδίο κειµένου 18.4.3 Περιοχές κειµένου: Τάξη JΤextArea Μια περιοχή κειµένου (text area) είναι παρόµοια µε ένα πεδίο κειµένου, αλλά επιτρέπει την εµφάνιση ή την εισαγωγή πολλών γραµµών κειµένου σ αυτή. Μερικοί από τους κατασκευαστές της είναι: public JΤextArea () δηµιουργεί µια νέα περιοχή κειµένου που είναι κενή, δηλαδή έχει 0 γραµµές, 0 στήλες και περιέχει την κενή συµβολοσειρά public JΤextArea (String συµβολοσειρά) δηµιουργεί µια νέα περιοχή κειµένου που περιέχει τη συµβολοσειρά. Το πλήθος των στηλών και γραµµών της περιοχής τίθεται στο 0 public JΤextArea (int αριθµός_γραµµών, int αριθµός_στηλών) δηµιουργεί µια νέα κενή περιοχή κειµένου, οι διαστάσεις της οποίας καθορίζονται από τους ακεραίους αριθµός_γραµµών και αριθµός_στηλών. Η τάξη JTextArea διαθέτει τις ίδιες µεθόδους -gettext, settext, seteditable και iseditable- µε την τάξη JTextField, γιατί οι δύο αυτές τάξεις είναι υποτάξεις της αφηρηµένης τάξης JTextComponent και κληρονοµούν τις µεθόδους που αναφέραµε στο Κεφάλαιο 18.4.2 από αυτήν. Τέλος η τάξη JTextArea διαθέτει επίσης τη µέθοδο:

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 507 public void append (String συµβολοσειρά) προσθέτει (επισυνάπτει) τη συµβολοσειρά στο τέλος ενός αντικειµένου τύπου JTextArea. Παράδειγµα 18.2 // δηµιουργεί µια εφαρµογή για την εισαγωγή των στοιχείων // (ονοµατεπώνυµο, διεύθυνση, τηλέφωνο) του χρήστη import java.awt.*; import javax.swing.*; public class Forma extends JFrame { JLabel namelabel = new JLabel ("Ονοµατεπώνυµο: "); JLabel addresslabel = new JLabel (" ιεύθυνση: "); JLabel telephonelabel = new JLabel ("Τηλέφωνο: "); JTextField namefield = new JTextField (); JTextArea addressarea = new JTextArea (); JTextField telephonefield = new JTextField (); public Forma() { super("εισαγωγή Στοιχείων"); Container ypodoxeas; ypodoxeas = getcontentpane (); ypodoxeas.setlayout (null); ypodoxeas.setbackground (new Color (38, 175, 249)); namelabel.setbounds (60, 30, 100, 20); ypodoxeas.add (namelabel); namefield.setbounds (180, 30, 200, 20); ypodoxeas.add (namefield); addresslabel.setbounds (60, 110, 100, 20); ypodoxeas.add (addresslabel); addressarea.setbounds (180, 100, 130, 40); ypodoxeas.add (addressarea); telephonelabel.setbounds (60, 200, 100, 20); ypodoxeas.add (telephonelabel); telephonefield.setbounds (180, 200, 100, 20); ypodoxeas.add (telephonefield); setsize (450, 300); // εννοείται this.setsize και setvisible (true); // this.setvisible, γιατί οι // εντολές αυτές βρίσκονται µέσα στον κατασκευαστή } // Forma public static void main (String[] args) { Forma input = new Forma();

508 Προγραµµατισµός µε Java input.setdefaultcloseoperation (EXIT_ON_CLOSE); } // main } // Forma Το αποτέλεσµα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής παρουσιάζεται στην Εικόνα 2 του ένθετου του βιβλίου. 18.4.4 Κουµπιά: Τάξη JButton Ένα κουµπί (button) είναι µια ορθογώνια περιοχή που περιέχει έναν τίτλο και που µε το πάτηµά της (δηλαδή όταν ο χρήστης τοποθετήσει το δροµέα του ποντικιού πάνω στην περιοχή αυτή και πατήσει το αριστερό πλήκτρο του ποντικιού) δηµιουργείται ένα γεγονός (βλ. Κεφ. 19.1). Μερικοί από τους κατασκευαστές της τάξης JButton, όπως οι παρακάτω, είναι παρόµοιοι µε αυτούς της τάξης JLabel: public JButton () δηµιουργεί ένα νέο κουµπί χωρίς τίτλο και χωρίς εικόνα public JButton (String συµβολοσειρά) δηµιουργεί ένα νέο κουµπί που έχει ως τίτλο του τη συµβολοσειρά. public JButton (Icon εικόνα) δηµιουργεί ένα κουµπί που περιέχει την εικόνα public JButton (String συµβολοσειρά, Icon εικόνα) δηµιουργεί ένα νέο κουµπί που περιέχει τη συµβολοσειρά και την εικόνα. Παρόλο που έχουµε τη δυνατότητα να πατήσουµε τα κουµπιά που δηµιουργούµε µε τους παραπάνω κατασκευαστές, η ενέργειά µας αυτή δεν έχει κανένα αποτέλεσµα. Για να έχει αποτέλεσµα η ενέργειά µας θα πρέπει να χρησιµοποιήσουµε τη µέθοδο: public void addactionlistener (ActionListener ακροατής_ενέργειας) που προσθέτει τον ακροατή_ενέργειας στο κουµπί (βλ. Κεφ 19.3.3). Ουσιαστικά ο ακροατής_ενέργειας αφουγκράζεται τα διάφορα γεγονότα που δηµιουργούνται από το κουµπί αυτό και δροµολογεί την αντιµετώπισή τους. Μερικές από τις άλλες µεθόδους που παρέχει η τάξη JButton είναι οι εξής: public void settext (String συµβολοσειρά) τοποθετεί τη συµβολοσειρά στο κουµπί

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 509 public String gettext () επιστρέφει το κείµενο που περιέχεται στο το κουµπί public void seticon (Icon εικόνα) τοποθετεί την εικόνα στο κουµπί public Icon geticon () επιστρέφει την εικόνα του κουµπιού. 18.5 ιαχειριστές ιάταξης Η Java παρέχει διαχειριστές που µας βοηθούν να οργανώσουµε τη διάταξη των συστατικών µιας Γ Χ σ έναν υποδοχέα, για λόγους εµφάνισης στην οθόνη. Ένας διαχειριστής διάταξης (layout manager) µας δίνει τη δυνατότητα να τοποθετήσουµε εύκολα τα συστατικά µιας Γ Χ σ έναν υποδοχέα, χωρίς να ασχολούµαστε µε τις λεπτοµέρειες της θέσης και του µεγέθους του κάθε συστατικού. Αυτό µας δίνει τη δυνατότητα να συγκεντρωθούµε στη βασική εµφάνιση και αίσθηση (look and feel) αγνοώντας τις περισσότερες βαρετές λεπτοµέρειες. Επιπλέον, η χρήση ενός διαχειριστή διάταξης δίνει την ίδια εµφάνιση και αίσθηση σε διάφορα προγραµµατιστικά περιβάλλοντα, πράγµα που δεν επιτυγχάνεται πάντα, όταν χρησιµοποιούµε απόλυτες συντεταγµένες. Οι διαχειριστές διάταξης της Java, που περιγράφονται παρακάτω 3, (κληρονο- µούν την τάξη Object και) υλοποιούν τη διεπαφή η οποία ορίζει τις µεθόδους που χρησιµοποιεί ένας διαχειριστής διάταξης για να καθορίσει τη θέση και το µέγεθος των συστατικών µιας Γ Χ µέσα σ ένα υποδοχέα. Σε κάθε χρονική στιγµή ένας υποδοχέας µπορεί να έχει ένα µόνο διαχειριστή διάταξης. ιαφορετικοί υποδοχείς στο ίδιο πρόγραµµα µπορεί να χρησιµοποιούν διαφορετικούς διαχειριστές διάταξης, που προσδιορίζονται µε κλήση της µεθόδου της τάξης Container: setlayout (διαχειριστής_διάταξης) προσδιορίζει τη διάταξη των συστατικών ενός υποδοχέα. και layout.layoutcontainer (container); στοιχίζει ξανά τα συστατικά που έχουν προστεθεί στον υποδοχέα container. 3 Η Java παρέχει κι άλλους διαχειριστές διάταξης, όπως τους BoxLayout, CardLayout και GridBagLayout που δεν περιγράφονται στο βιβλίο αυτό.

510 Προγραµµατισµός µε Java 18.5.1 FlowLayout Είναι ο απλούστερος διαχειριστής διάταξης της Java. Τοποθετεί τα συστατικά µιας Γ Χ σ έναν υποδοχέα από αριστερά προς τα δεξιά µε τη σειρά που αυτά προστίθενται σε αυτόν. Όταν φθάσει στο δεξί όριο του υποδοχέα, συνεχίζει να προσθέτει συστατικά από την επόµενη σειρά του. Είναι ο εξ ορισµού διαχειριστής διάταξης για τον υποδοχέα JPanel. Η τάξη FlowLayout επιτρέπει στα συστατικά µιας Γ Χ να είναι στοιχισµένα προς τα αριστερά, στο κέντρο ή προς τα δεξιά παρέχοντας τη µέθοδο κατασκευαστή: public FlowLayout (int στοίχιση) Η παράµετρος στοίχιση της οποίας µπορεί να έχει ως τιµή µια από τις παρακάτω σταθερές: Σταθερά Στοίχιση FlowLayout.LEFT αριστερά FlowLayout.CENTER κέντρο FlowLayout.RIGHT δεξιά Με τη µέθοδο: public void setalignment (int στοίχιση) παρέχει τη δυνατότητα καθορισµού της στοίχισης εκ των υστέρων. Και πάλι η παράµετρος στοίχιση µπορεί να έχει µια από τις παραπάνω τιµές. Αν δεν προσδιοριστεί η διάταξη των συστατικών µε κάποια από τις παραπάνω µεθόδους, τότε αυτή εξ ορισµού θεωρείται ως κεντρική. Παράδειγµα 18.3 // χρήση του διαχειριστή διάταξης FlowLayout import java.awt.*; import javax.swing.*; public class FlowCalculator extends JFrame { // ένας πίνακας κουµπιών private JButton buttons[] = new JButton [10]; public FlowCalculator () { super("υπολογιστής"); Container c = getcontentpane (); c.setlayout (new FlowLayout()); // δηµιουργεί κάθε ένα από τα 10 κουµπιά και το

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 511 // προσθέτει στον υαλοπίνακα των περιεχοµένων του // πλαισίου for (int i = 0; i < 10; i++) { buttons[i] = new JButton (""+i); c.add (buttons[i]); } setsize (300, 170); setvisible (true); } // FlowCalculator public static void main (String args[]) { FlowCalculator calc = new FlowCalculator (); calc.setdefaultcloseoperation (EXIT_ON_CLOSE); } // main } // FlowCalculator Το αποτέλεσµα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής παρουσιάζεται στην Εικόνα 3 του ένθετου του βιβλίου. 18.5.2 GridLayout Ο διαχειριστής διάταξης GridLayout διαιρεί έναν υποδοχέα σε πλαίσια, έτσι ώστε τα συστατικά που προστίθενται σ αυτόν να µπορούν να τοποθετηθούν οριζόντια σε γραµµές και κατακόρυφα σε στήλες. Όλα τα συστατικό που τοποθετούνται σε έναν υποδοχέα µε διαχειριστή διάταξης τύπου GridLayout έχουν το ίδιο πλάτος και ύ- ψος. Τα συστατικά προστίθενται αρχίζοντας από το πάνω αριστερά κελί του πλαισίου και συνεχίζουν αριστερά προς τα δεξιά µέχρι να γεµίσει η πρώτη γραµµή. Η διαδικασία αυτή συνεχίζεται για τη δεύτερη γραµµή κ.ο.κ. Η µέθοδος κατασκευαστής: public GridLayout (int γραµµές, int στήλες) δηµιουργεί ένα διαχειριστή GridLayout µε γραµµές γραµµές και στήλες στήλες. Μια µόνο το πολύ από τις παραµέτρους στήλες και γραµµές µπορεί να είναι 0, υπονοώντας ότι οσαδήποτε αντικείµενα µπορούν να τοποθετηθούν κατά µήκος µιας στήλης ή µιας γραµµής αντίστοιχα. Η µέθοδος κατασκευαστής: public GridLayout (int γραµµές, int στήλες, int x, int y) δηµιουργεί ένα διαχειριστή GridLayout µε γραµµές γραµµές, στήλες στήλες, x pixels (εικονοστοιχεία 4 ) οριζόντιο κενό χώρο µεταξύ των γραµµών και y 4 Βλ. Κάβουρα, Ι. Κ. Οργάνωση Συστηµάτων Υπολογιστών (Συστήµατα Υπολογιστών Τόµος Ι), εκδ. Κλειδάριθµος, Έκδοση 6 η, Αθήνα 2003, Κεφ.5.2.3.2.

512 Προγραµµατισµός µε Java pixels κατακόρυφο κενό χώρο µεταξύ των στηλών. Και εδώ ισχύει ο περιορισµός σχετικά µε τις µηδενικές τιµές των παραµέτρων γραµµές και στήλες. Παράδειγµα 18.4 // χρήση του διαχειριστή διάταξης GridLayout import java.awt.*; import javax.swing.*; public class GridCalculator extends JFrame { // πίνακας κουµπιών private JButton buttons[] = new JButton [10]; public GridCalculator () { super("υπολογιστής"); Container c = getcontentpane (); c.setlayout (new GridLayout(4, 3)); // δηµιουργία και προσθήκη κουµπιών for (int i = 0; i < 10; i++) { buttons[i] = new JButton (""+i); c.add (buttons[i]); } setsize(300, 170); setvisible(true); } // GridCalculator public static void main (String args[]) { GridCalculator calc = new GridCalculator (); calc.setdefaultcloseoperation (EXIT_ON_CLOSE); } // main } // GridCalculator Το αποτέλεσµα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής παρουσιάζεται στην Εικόνα 4 του ένθετου του βιβλίου. 18.5.3 BorderLayout Ο διαχειριστής BorderLayout τοποθετεί τα συστατικά µέσα σε πέντε περιοχές: NORTH (βορράς), SOUTH (νότος), EAST (ανατολή), WEST (δύση) και CEN- TER (κέντρο), όπου NORTH αντιστοιχεί στην κορυφή του υποδοχέα. Μπορούν να προστεθούν άµεσα µέχρι πέντε συστατικά, ένα για την κάθε περιοχή. Τα συστα-

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 513 τικά που τοποθετούνται στις περιοχές NORTH και SOUTH επεκτείνονται οριζοντίως µέχρις τις πλευρές του υποδοχέα. Το ύψος των περιοχών αυτών είναι τόσο όσο και το ύψος των συστατικών που περιέχουν. Οι περιοχές EAST και WEST επεκτείνονται κατακόρυφα και έχουν πλάτος ίσο µε το πλάτος των συστατικών που τοποθετούνται σ αυτές. Το συστατικό που τοποθετείται στην περιοχή CENTER επεκτείνεται έτσι ώστε να γεµίσει όλο τον υπόλοιπο χώρο του υποδοχέα. Το συστατικό που τοποθετείται στην κάθε περιοχή µπορεί να είναι ένας υποδοχέας µέσα στον οποίο µπορούν να προστεθούν άλλα συστατικά. Αν και οι πέντε περιοχές είναι κατειληµµένες, τότε όλος ο χώρος του υποδοχέα καλύπτεται από συστατικά της Γ Χ. Αν οι περιοχές NORTH ή SOUTH δεν είναι κατειληµµένες, τα συστατικά στις περιοχές EAST, CENTER και WEST επεκτείνονται κατακόρυφα έτσι ώστε να γεµίσουν το χώρο που αποµένει. Αν οι περιοχές EAST ή WEST δεν είναι κατειληµµένες, το συστατικό στην περιοχή CENTER επεκτείνεται οριζόντια έτσι ώστε να γεµίσει το χώρο που αποµένει. Τέλος, αν η περιοχή CENTER δεν είναι κατειληµµένη, τότε αυτή παραµένει κενή (τα υπόλοιπα συστατικά δεν επεκτείνονται για να γεµίσουν το χώρο που αποµένει). Ο διαχειριστής BorderLayout είναι ο εξ ορισµού διαχειριστής του υαλοπίνακα περιεχοµένων των υποδοχέων τύπου JFrame και JApplet. Η εντολή: BorderLayout layout = new BorderLayout (x, y); προσδιορίζει το πλήθος x των εικονοστοιχείων που καταλαµβάνει ο χώρος µεταξύ των συστατικών που τοποθετούνται οριζοντίως (horizontal gap space) και το πλήθος y των εικονοστοιχείων που καταλαµβάνει ο χώρος µεταξύ των συστατικών που τοποθετούνται κατακόρυφα (vertical gap space), αντίστοιχα. Ο εξορισµού κατασκευαστής της τάξης BorderLayout δίνει χώρους πλάτους 0 εικονοστοιχείων µεταξύ των συστατικών. Η πρoσθήκη ενός συστατικού σ έναν υποδοχέα container στον οποίο έ- χουµε θέσει ως διαχειριστή διάταξης ένα αντικείµενο τύπου BorderLayout επιτυγχάνεται µε την εντολή: container.add (συστατικό, περιοχή); όπου περιοχή είναι µια από τις σταθερές BorderLayout.NORTH, Border_Layout.SOUTH, BorderLayout.EAST, BorderLayout.- WEST ή BorderLayout.CENTER. Αν δεν προσδιοριστεί η περιοχή στην παραπάνω µέθοδο, τότε το συστατικό τοποθετείται στην περιοχή BorderLayout.CENTER. Η προσθήκη περισσοτέ-

514 Προγραµµατισµός µε Java ρων από ένα συστατικών σε µια ορισµένη περιοχή έχει ως αποτέλεσµα να εµφανίζεται µόνο το τελευταίο συστατικό που έχει προστεθεί. 18.6 Πανό: Τάξη JPanel Σύνθετες Γ Χ απαιτούν να τοποθετούµε κάθε συστατικό σε µια ακριβή θέση ενός υποδοχέα. Οι διαπαφές αυτές αποτελούνται συχνά από πολλά πανό τα συστατικά κάθε ενός των οποίων είναι τοποθετηµένα σε µια ορισµένη διάταξη. Ένα πανό {panel) είναι ένας υποδοχέας µέσα στον οποίο µπορούν να προστεθούν συστατικά µιας Γ Χ. Τα πανό δηµιουργούνται από την τάξη JPanel µια υποτάξη της τάξης JComponent. Η τάξη JComponent κληρονοµεί την τάξη java.awt.container δηλαδή κάθε αντικείµενο τύπου JPanel είναι ένας υποδοχέας. Ένα αντικείµενο τύπου JPanel µπορεί να περιέχει οποιοδήποτε συστατικό Γ Χ. Έτσι µπορούµε να προσθέσουµε συστατικά, συµπεριλαµβανοµένων και άλλων πανό µέσα σ ένα αντικείµενο τύπου JPanel. Ο υποδοχέας JPanel µια ειδική περιοχή µέσα στην οποία µπορούν να σχεδιαστούν είτε γραφικά είτε συστατικά του Swing. Τα πανό είναι πολύ χρήσιµα όταν θέλουµε να εµφανίσουµε σωστά ταυτόχρονα γραφικά και συστατικά του Swing. Αρκεί να ετοιµάσουµε διαφορετικά πανό για το καθένα και να τα προσθέσουµε σε κάποιον άλλο υποδοχέα. Τα αντικείµενα τύπου JPanel είναι εξ ορισµού αδιαφανή. Η εντολή: JPanel panel = new JPanel(); δηµιουργεί ένα νέο πανό. Σε αντίθεση µε τους υποδοχείς JFrame και JApplet, τα πανό δε διαθέτουν υαλοπίνακα περιεχοµένων. Έτσι, η προσθήκη ενός συστατικού σ ένα πανό επιτυγχάνεται απλά µε την εντολή: panel.add (συστατικό); Όπως ήδη αναφέραµε, η µέθοδος add της τάξης Container προσθέτει ένα αντικείµενο της τάξης Component ή κάποιας υποτάξης της σ ένα αντικείµενο τύπου Container. Έτσι ένα αντικείµενο τύπου JPanel µπορεί να προστεθεί σ οποιοδήποτε αντικείµενο µιας υποτάξης της Component, και οποιοδήποτε αντικείµενο µιας υποτάξης της Component µπορεί να προστεθεί σ ένα αντικείµενο τύπου JPanel Όπως θα δούµε στο επόµενο κεφάλαιο, τα πανό είναι πολύ ευέλικτα. Τα προγράµµατα συχνά δηµιουργούν υποτάξεις της τάξης JPanel για τη δηµιουργία συγκεκριµένων περιοχών σχεδίασης και η δηµιουργία περιοχών που δέχονται γεγονότα του ποντικιού.

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 515 Παράδειγµα 18.5 // επίδειξη χρήσης πανό import java.awt.*; import javax.swing.*; public class PanelApp extends JFrame { private JPanel buttonpanel; private JButton[] buttons; // στήσε τη Γ Χ public PanelApp() { super("επίδειξη ενός πανό"); // πάρε τον υαλοπίνακα των περιεχοµένων του // πλαισίου Container framecontainer = getcontentpane(); // δηµιούργησε έναν πίνακα πέντε κουµπιών buttons = new JButton[5]; // στήσε το πανό και καθόρισε τη διάταξή του buttonpanel = new JPanel(); buttonpanel.setlayout(new GridLayout(1, buttons.length)); // δηµιούργησε και πρόσθεσε τα κουµπιά στο πανό for (int i = 0; i < buttons.length; i++) { buttons[i] = new JButton("Button " + i); buttonpanel.add(buttons[i]); } // πρόσθεσε το πανό στον υαλοπίνακα των // περιεχοµένων του πλαισίου (ο εξ ορισµού // διαχειριστής του υαλοπίνακα περιεχοµένων των // υποδοχέων τύπου JFrame είναι BorderLayout) framecontainer.add (buttonpanel, BorderLayout.SOUTH); // εµφάνισε το πλαίσιο setsize(425, 150); setvisible(true); } // PanelApp // εκτέλεσε την εφαρµογή public static void main (String[] args)

516 Προγραµµατισµός µε Java { PanelApp appl = new PanelApp(); appl.setdefaultcloseoperation(jframe.exit_on_close); } // main } // PanelApp Το αποτέλεσµα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής παρουσιάζεται στην Εικόνα 5 του ένθετου του βιβλίου. Παράδειγµα 18.6 // χρήση πανό και του διαχειριστή διάταξης BorderLayout import java.awt.*; import javax.swing.*; public class BorderCalculator extends JFrame { // ένας πίνακας κουµπιών private JButton buttons[] = new JButton [10]; // ένας πίνακας πανό private JPanel panels []= new JPanel [5]; public BorderCalculator () { super("υπολογιστής"); Container c = getcontentpane (); c.setlayout (new BorderLayout ()); // δηµιούργησε τα πανό for (int i = 0; i < 5; i++) panels[i] = new JPanel (); // δηµιούργησε τα κουµπιά for (int i = 0; i < 10; i++) buttons[i] = new JButton (""+i); // πρόσθεσε δύο κουµπιά σε κάθε πανό for (int i = 0; i < 5; i++) { panels[i].add (buttons[2*i]); panels[i].add (buttons[2*i+1]); } // τοποθέτησε τα πανό στα κατάλληλα σηµεία c.add (panels[0], BorderLayout.NORTH); c.add (panels[1], BorderLayout.WEST); c.add (panels[2], BorderLayout.CENTER); c.add (panels[3], BorderLayout.EAST); c.add (panels[4], BorderLayout.SOUTH);

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 517 setsize (300, 170); setvisible (true); } // BorderCalculator public static void main (String args[]) { BorderCalculator calc = new BorderCalculator (); calc.setdefaultcloseoperation (EXIT_ON_CLOSE); } // main } // BorderCalculator Τα αποτελέσµατα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής παρουσιάζονται στην Εικόνα 6 του ένθετου του βιβλίου. 18.7 Η τάξη Graphics Η τάξη Graphics µας επιτρέπει να σχεδιάζουµε σχήµατα κ.ά. σε διάφορες συσκευές εµφάνισης εικόνων. Για λόγους φορητότητας η τάξη αυτή είναι µια αφηρηµένη τάξη, διότι ο σχεδιασµός των σχηµάτων επιτυγχάνεται µε διαφορετικό τρόπο σε κάθε πλατφόρµα που υποστηρίζει τη Java. Έτσι, όταν η Java υλοποιείται σε κάποια πλατφόρµα, δηµιουργείται µια νέα τάξη που προέρχεται από την τάξη Graphics. Η νέα τάξη είναι αυτή που στην πραγµατικότητα παρέχει τις ικανότητες σχεδίασης. Η υλοποίηση αυτή δεν είναι φανερή στον προγραµµατιστή κι έτσι αυτός µπορεί να χρησιµοποιήσει τις µεθόδους της τάξης Graphics για να σχεδιάσει µε τρόπο που είναι ανεξάρτητος από την εκάστοτε πλατφόρµα υλισµικού και λογισµικού. Η µέθοδος paint της τάξης Component παίρνει ως παράµετρο ένα αντικεί- µενο τύπου Graphics που στην πραγµατικότητα είναι µια αναφορά ενός αντικει- µένου της τάξης που προέρχεται από την τάξη Graphics. Όταν οποιοδήποτε συστατικό µιας Γ Χ πρόκειται να εµφανιστεί στην οθόνη, τότε το σύστηµα καλεί αυτόµατα τη µέθοδο paint. Όπως ήδη αναφέραµε, ένας προγραµµατιστή πολύ σπάνια χρειάζεται να καλέσει άµεσα τη µέθοδο paint. Αντ αυτής καλεί συνήθως τη µέθοδο repaint(). Η τελευταία ζητά να κληθεί η µέθοδος update (Graphics g)της τάξης Component όσο γίνεται πιο γρήγορα. Η µέθοδος update καθορίζει το παρασκήνιο του συστατικού από οτιδήποτε περιέχει και καλεί η ίδια άµεσα τη µέθοδο paint. Η µέθοδος update, όπως και η µέθοδος paint, παίρνει και αυτή ως παρά- µετρο ένα αντικείµενο τύπου Graphics που στην πραγµατικότητα είναι µια α- ναφορά αντικειµένου της τάξης που προέρχεται από την τάξη Graphics. Το α- ντικείµενο αυτό παρέχεται αυτόµατα από το σύστηµα στη µέθοδο update.

518 Προγραµµατισµός µε Java Ένα αντικείµενο τύπου Graphics έχει διάφορες ιδιότητες που απαιτούνται για την εµφάνισή του. Μερικές από τις ιδιότητες αυτές είναι: το αντικείµενο-συστατικό πάνω στο οποίο θα σχεδιαστεί τις συντεταγµένες το τρέχον χρώµα του το τρέχον font του κ.ά. Μερικές από τις µεθόδους της τάξης Graphics δίνονται στα παρακάτω. Όπου δεν αναφέρεται ρητά οι µέθοδοι αυτές χρησιµοποιούν το τρέχον χρώµα των γραφικών συµφραζοµένων. Οι παράµετροι width (πλάτος) και height (ύψος) πρέπει να έχουν µη αρνητικές τιµές, ειδάλλως το εν λόγω σχήµα δε θα εµφανιστεί. Οι συντεταγµένες αυτές µετριούνται σε εικονοστοιχεία από το πάνω αριστερά σηµείο του παραθύρου του υποδοχέα. Οι συντεταγµένες (0, 0) αντιστοιχούν στην άνω αριστερά γωνία του παραθύρου του υποδοχέα: public abstract void drawstring (String συµβολοσειρά, int x, int y) σχεδιάζει τη συµβολοσειρά αρχίζοντας από τη θέση (x, y) public abstract void drawline (int x1, int y1, int x2, int y2) σχεδιάζει µια γραµµή µεταξύ των σηµείων (x1, y1) και (x2, y2) public void drawrect (int x, int y, int width, int height) σχεδιάζει ένα ορθογώνιο παραλληλόγραµµο που έχει πλάτος width και ύψος height. Η πάνω αριστερή γωνία του ορθογωνίου έχει συντεταγµένες (x, y) public abstract void fillrect (int x, int y, int width, int height) όπως η προηγούµενη µέθοδος, µόνο που το ορθογώνιο είναι γεµάτο µε το τρέχον χρώµα public abstract void clearrect (int x, int y, int width, int height) όπως η προηγούµενη µέθοδος, µόνο που το ορθογώνιο έχει το τρέχον παρασκηνιακό χρώµα της τρέχουσας επιφανείας σχεδίασης. public abstract void drawroundrect (int x, int y, int width, int height, int arcwidht, int archeight)

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 519 σχεδιάζει ένα ορθογώνιο παραλληλόγραµµο που έχει πλάτος width και ύψος height και στρογγυλές γωνίες πλάτους arcwidht και ύψους archeight public abstract void fillroundrect (int x, int y, int width, int height, int arcwidht, int archeight) όπως η προηγούµενη µέθοδος µόνο που το ορθογώνιο µε τις στρογγυλές γωνίες είναι γεµάτο µε το τρέχον χρώµα public abstract void drawoval (int x, int y, int width, int height) σχεδιάζει µια έλλειψη που έχει πλάτος width και ύψος height. Η πάνω αριστερά γωνία του ορθογωνίου που περικλείει την έλλειψη αυτή έχει συντεταγµένες (x, y). Η έλλειψη αγγίζει και τις τέσσερις πλευρές του ορθογωνίου αυτού στο κέντρο τους public abstract void filloval (int x, int y, int width, int height) όπως η προηγούµενη µέθοδος µόνο που η έλλειψη είναι χρωµατισµένη µε το τρέχον χρώµα public abstract void drawarc (int x, int y, int width, int height, int αρχική_γωνία, int γωνία_τόξου) σχεδιάζει ένα τόξο που έχει γωνία_τόξου µοιρών, ξεκινώντας από την αρχική_ γωνία. Αρνητικές τιµές της παραµέτρου γωνία_τόξου σηµαίνουν σχεδίαση του τόξου µε φορά ίδια µε αυτή των δεικτών του ρολογιού, ενώ θετικές τιµές σηµαίνουν σχεδίαση µε φορά αντίθετη από αυτήν των δεικτών του ρολογιού. Η τιµή 0 της παραµέτρου αρχική_γωνία αντιστοιχεί στο δεξιότερο σηµείο της έλλειψης στην οποία ανήκει το τόξο. Τέλος, οι παράµετροι x και y προσδιορίζουν το πάνω αριστερό σηµείο του ορθογωνίου, στο οποίο είναι περικλείεται η έλλειψη, ενώ οι παράµετροι width και height το πλάτος και το ύψος του ορθογωνίου ατού, αντίστοιχα public abstract void fillarc (int x, int y, int width, int height, int αρχική_γωνία, int γωνία_τόξου) όπως και η προηγούµενη µέθοδος, µόνο που το τόξο είναι χρωµατισµένο µε το τρέχον χρώµα public abstract Color getcolor () επιστρέφει το τρέχον χρώµα των γραφικών συµφραζοµένων public abstract void setcolor (Color c) θέτει το τρέχον χρώµα αυτών των γραφικών συµφραζοµένων σε c public abstract Font getfont ()

520 Προγραµµατισµός µε Java επιστρέφει το τρέχον Font public abstract void setfont (Font font) θέτει το τρέχον font, στυλ και µέγεθος σ αυτά που προσδιορίζει η παράµετρος font public abstract void translate (int x, int y) µεταφράζει τις αρχικές συντεταγµένες των γραφικών συµφραζοµένων στο σηµείο (x, y) του τρέχοντος συστήµατος συντεταγµένων. Τροποποιεί τα γραφικά συµφραζόµενα έτσι ώστε η νέα τους αρχή να αντιστοιχεί στο σηµείο (x, y) στο αρχικό σύστηµα συντεταγµένων των γραφικών αυτών συµφραζοµένων. Όλες οι συντεταγµένες που χρησιµοποιούνται ακολούθως για τα συµφραζόµενα αυτά θα είναι σχετικές ως προς τη νέα αρχή. Παράδειγµα 18.7 import java.awt.*; import javax.swing.*; import java.io.*; public class ShapeDrawing extends JFrame // σχεδιάζει γραµµές, ορθογώνια ή ελλείψεις, ανάλογα µε // την επιλογή του χρήστη { static int choice; // η επιλογή του χρήστη public ShapeDrawing () { getcontentpane ().setbackground (new Color (209, 155, 73)); setsize (400, 400); setvisible (true); } // ShapeDrawing public void paint (Graphics g) { super.paint(g); // δεν είναι απαραίτητη 5 for ( int i = 0; i < 10; i++ ) { switch (choice) { case 1: // σχεδίαση γραµµών settitle ("Γραµµές"); g.drawline( 50, 50, 300, 50 + i*10 ); break; 5 Αλλά, αν την παραλείψουµε, µπορεί να προκύψουν περίπλοκα µικρά σφάλµατα σε εφαρµογές ή µικροεφαρµογές που συνδυάζουν εµφάνιση γραφικών µε γραφικές διεπαφές χρήστη.

Κεφάλαιο 18: Γραφικές ιεπαφές Χρήστη και Γραφικά 521 case 2: // σχεδίαση ορθογωνίων settitle ("Ορθογώνια"); g.drawrect( 50 + i*10, 50 + i*10, 100 + i*10, 100 + i*10 ); break; case 3: // σχεδίαση ελλείψεων settitle ("Ελλείψεις"); g.drawoval( 50 + i*10, 50 + i*10, 100 + i*10, 100 + i*10 ); break; default: // λανθασµένη επιλογή settitle ("Λανθασµένη Επιλογή"); g.drawstring ("Προσπαθήστε Ξανά", 50, 100); } } } // paint public static void main (String args[]) throws IOException { // ζητάει από το χρήστη να επιλέξει το προς // σχεδίασε σχήµατα System.out.println ("1. Σχεδίαση Γραµµών"); System.out.println ("2. Σχεδίαση Ορθογωνίων"); System.out.println ("3. Σχεδίαση Ελλείψεων"); System.out.print ("Εισάγετε την επιλογή σας: "); choice = my.readint (); ShapeDrawing efarmogh = new ShapeDrawing (); efarmogh.setdefaultcloseoperation(exit_on_close); } // main } // ShapeDrawing Τα αποτελέσµατα της εκτέλεσης του προγράµµατος της εφαρµογής αυτής (ανάλογα µε την επιλογή του χρήστη) παρουσιάζονται στην Εικόνα 7 του ένθετου του βιβλίου. 18.8 Η τάξη Color Η τάξη Color ορίζει σταθερές και µεθόδους για την επεξεργασία χρωµάτων σε προγράµµατα της Java. Οι δηµόσιες στατικές σταθερές τύπου Color που ορίζει η τάξη αυτή είναι:

522 Προγραµµατισµός µε Java Σταθερά Χρώµα Τιµή RGB black (BLACK) µαύρο 0, 0, 0 blue (BLUE) µπλε 0, 0, 255 cyan (CYAN) κυανό 0, 255, 255 darkgray (DARK_GRAY) σκούρο γκρίζο 64, 64, 64 gray (GRAY) γκρίζο 128, 128, 128 green (GREEN) πράσινο 0, 255, 0 lightgray (LIGHT_GRAY) ελαφρύ γκρίζο 192, 192, 192 magenta (MAGENTA) βαθύ κόκκινο 255, 0, 255 orange (ORANGE) πορτοκαλί 255, 200, 0 pink (PINK) ροζ 255, 175, 175 red (RED) κόκκινο 255, 0, 0 white (WHITE) λευκό 255, 255, 255 yellow (YELLOW) κίτρινο 255, 255, 0 Οποιοδήποτε χρώµα µπορεί να αναπαραχθεί από συνδυασµό των χρωµάτων κόκκινο (red), πράσινο (green) και µπλε (blue). Οι αναλογίες των χρωµάτων αυτών είναι γνωστές ως τιµές RGB και οι τιµές αυτές µπορεί να είναι ακέραιες στην περιοχή 0 ως 255 ή κινητής υποδιαστολής στην περιοχή 0.0F ως 1.0F. Η πρώτη τιµή προσδιορίζει το ποσοστό του κόκκινου, η δεύτερη το ποσοστό του πράσινου και η τρίτη το ποσοστό του µπλε. Η Java επιτρέπει στον προγραµµατιστή να επιλέξει µεταξύ 256x256x256 (περίπου 16.7 εκατοµµύρια διαφορετικά χρώµατα). Μερικοί από τους κατασκευαστές της τάξης Color είναι: public Color (int r, int g, int b, int a) δηµιουργεί ένα χρώµα που βασίζεται στις τιµές από 0 έως 255 των r (κόκκινο), g (πράσινο) και b (µπλε). Η παράµετρος a προσδιορίζει τη διαφάνεια του χρώµατος. Αν η τιµή του a είναι ίση µε 255 το χρώµα είναι τελείως αδιαφανές. Ενώ αν η τι- µή του a είναι ίση µε 0, τότε το χρώµα είναι τελείως διαφανές public Color (int r, int g, int b) όπως και η παραπάνω µέθοδος, δηµιουργεί ένα χρώµα που βασίζεται στις τιµές από 0 έως 255 των r (κόκκινο), g (πράσινο) και b (µπλε). Ισοδυναµεί µε την Color(r, g, b, 255) public Color (float r, float g, float b, float a) δηµιουργεί ένα χρώµα που βασίζεται στις τιµές από 0.0f έως 1.0f των r (κόκκινο), g (πράσινο) και b (µπλε) [οι παράµετροι εδώ είναι τύπου float]. Η παράµετρος a προσδιορίζει, όπως και παραπάνω, τη διαφάνεια του χρώµατος (αν