8. Το μοντέλο συμβάντων του AWT

Σχετικά έγγραφα
ΓΡΑΦΙΚΕΣ ΔΙΕΠΑΦΕΣ ΧΡΗΣΤΗ- SWING (1)

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

Week 12: GUIs with Swing

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

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

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

Week 10: Graphical User Interfaces

Διδάσκων: Παναγιώτης Ανδρέου

8.1 Top-Level Swing Containers και Swing Components

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

9. Η βιβλιοθήκη Components του AWT

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

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

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

Το επόμενο σχήμα εμφανίζει την ιεραρχία των GUI-components κλάσεων μαζί με κάποιες επιπλέον συμπληρωματικές κλάσεις που διαχειρίζονται ένα GUI.

11. Προηγμένα χαρακτηριστικά της γλώσσας

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

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

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

8.1 Γενικά για το AWT (Abstract Window Toolkit)

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006)

Επαναληπτικό φύλλο εργασίας 07/04/2009

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

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

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

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

Βασικά της γλώσσας JAVA

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

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

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

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2004)

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

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

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

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

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

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

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

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

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

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

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

Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Γενικά (για τις γραπτές εξετάσεις)

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

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

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

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

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

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

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

Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010

Δραστηριότητα 1. Προγραμματίζω τον υπολογιστή (10 ώρες).

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

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

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

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

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

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

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

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED αντικειμενοστραφής προγραμματισμός ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ. Ι. Ψαρομήλιγκος Χ. Κυτάγιας

ΗΥ-252 Αντικειµενοστρεφής Προγραµµατισµός Βασίλης Χριστοφίδης. Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 2 Σεπτεµβρίου 2005

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

Σχεδίαση Κλάσεων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

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

10. Εισαγωγή στα Java Applets

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Διδάσκων: Παναγιώτης Ανδρέου

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

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

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Εφαρμογή Αναζήτησης στον Ελληνικό Γεωγραφικό Χώρο

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

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

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

Προγραμματισμός ΙΙ (Java) 8-9. Γραφικές Διεπαφές

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

Οδηγίες Συγγραφής και Αξιολόγησης Εργασιών του μαθήματος

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

Πακέτα (Packages) Φωλιασμένες ή Εσωτερικές Κλάσεις (Inner Classes) Παναγιώτης Σφέτσος, PhD

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

(Διαφάνειες Νίκου Βιδάκη)

Transcript:

8. Το μοντέλο συμβάντων του AWT Τελειώνοντας αυτό το κεφάλαιο θα μπορείτε: Να γράφετε κώδικα που θα αντιμετωπίζει συμβάντα που θα συμβαίνουν στη διεπαφή με το χρήστη Να χρησιμοποιείτε τις κατάλληλες διεπαφές και μεθόδους χειρισμού για πλήθος τύπων συμβάντων Να καθορίζετε από το αντικείμενο event (συμβάντος) λεπτομέρειες σχετικά με τη πράξη του χρήστη που προκάλεσε το συμβάν Να χρησιμοποιείτε την κατάλληλη κλάση adapter (προσαρμοστή) για να επιλέξετε ένα υποσύνολο από χειριστές συμβάντων για έναν event listener. 8.1 Τι είναι ένα συμβάν Όταν ένας χρήστης πραγματοποιεί μια πράξη στη διεπαφή με το χρήστη, αυτό προκαλεί τη δημιουργία ενός συμβάντος (event). Τα συμβάντα είναι αντικείμενα που περιγράφουν τι συνέβη. Υπάρχει ένα πλήθος διαφορετικών κλάσεων συμβάντων που περιγράφουν διαφορετικές γενικές κατηγορίες πράξεων του χρήστη. 8.1.1. Πηγές συμβάντων Μία πηγή συμβάντος (στο επίπεδο της διεπαφής με το χρήστη) είναι το αποτέλεσμα κάποιας πράξης του χρήστη σε ένα AWT component. Για παράδειγμα, ένα κλικ με το ποντίκι σε ένα button component θα παράγει (θα είναι η πηγή) ενός ActionEvent. Το ActionEvent είναι ένα αντικείμενο (κλάση) που περιέχει πληροφορία σχετικά με την κατάσταση του συμβάντος: ActionCommand το όνομα της εντολής που σχετίζεται με την πράξη Τροποποιητές οποιοιδήποτε τροποποιητές (modifiers) που αποθηκεύθηκαν κατά την πράξη. 8.1.2. Χειριστές συμβάντων Όταν λαμβάνει χώρα ένα συμβάν, το συμβάν λαμβάνεται από ένα component με το οποίο ο χρήστης είχε αλληλεπίδραση. Για παράδειγμα, το button, slider, text field κλπ. Ένας χειριστής συμβάντων (event handler) είναι η μέθοδος που λαμβάνει το αντικείμενο Event έτσι ώστε το πρόγραμμα να μπορεί να επεξεργαστεί την αλληλεπίδραση με το χρήστη. 8.1.3. Πώς γίνεται η επεξεργασία των συμβάντων Μεταξύ των JDK 1.0 και JDK 1.1 υπάρχουν σημαντικές αλλαγές σχετικά με τον τρόπο που τα συμβάντα λαμβάνονται και επεξεργάζονται. Στο κεφάλαιο αυτό θα συγκρίνουμε το παλιό μοντέλο συμβάντων (JDK 1.0) και το τρέχον μοντέλο συμβάντων (JDK 1.1 και εξής). 1

8.2 Μοντέλο συμβάντων JDK 1.0 εναντίον JDK 1.1 To JDK 1.0 ακολουθεί ένα ιεραρχικό μοντέλο συμβάντων και το JDK 1.1 χρησιμοποιεί ένα μοντέλο συμβάντων με χρήση εξουσιοδότησης (delegation event model). Είναι σημαντικό να γνωρίζουμε πώς συγκρίνονται τα δύο μοντέλα συμβάντων. 8.2.1. Ιεραρχικό μοντέλο (JDK 1.0) Το ιεραρχικό μοντέλο βασίζεται στο «περιέχειν». Τα συμβάντα αποστέλλονται πρώτα στο component και στη συνέχεια προωθούνται προς τα πάνω στην ιεραρχία που δημιουργείται από τη σχέση «περιέχειν». Τα συμβάντα που δεν αντιμετωπίζονται από το component θα συνεχίσουν αυτόματα να προωθούνται στο container του component. Frame Panel Button συμβάν πράξης Για παράδειγμα, στο πιο πάνω σχήμα, ένα κλικ με το ποντίκι στο αντικείμενο Button (που περιέχεται σε ένα Panel μέσα σε ένα Frame) στέλνει ένα action event πρώτα στο ίδιο το Button. Αν το Button δεν το χειριστεί, το συμβάν θα αποσταλεί στη συνέχεια στο Panel και αν και αυτό δεν το χειριστεί το συμβάν αποστέλλεται στο Frame. Υπάρχει ένα προφανές πλεονέκτημα σε αυτό το μοντέλο: Είναι απλό και ταιριάζει σε ένα περιβάλλον αντικειμενοστρεφούς προγραμματισμού άλλωστε τα components της Java κληρονομούν από την κλάση java.awt.component, όπου και βρίσκεται η μέθοδος handleevent. Υπάρχουν όμως και ορισμένα μειονεκτήματα: Δεν υπάρχει απλώς τρόπος για να «φιλτράρουμε» τα συμβάντα. Για να χειριστούμε ένα συμβάν πρέπει είτε να δημιουργήσουμε υποκλάσεις του component που λαμβάνει το συμβάν είτε να δημιουργήσουμε μία μεγάλη μέθοδο handleevent στο βασικό container. 8.2.2. Μοντέλο εξουσιοδότησης (JDK 1.1) Το JDK 1.1 εισήγαγε ένα νέο μοντέλο συμβάντων που ονομάζεται το μοντέλο εξουσιοδότησης συμβάντων (delegation event model). Στο μοντέλο εξουσιοδότησης συμβάντων τα συμβάντα αποστέλλονται σε ένα component, αλλά εξαρτάται από το ίδιο το component να καταχωρήσει (register) μία ρουτίνα χειρισμού συμβάντων (που 2

ονομάζεται listener) για να λαμβάνει το συμβάν. Με τον τρόπο αυτό ο χειριστής συμβάντων μπορεί να βρίσκεται σε μία κλάση έξω από το component. Ο χειρισμός του συμβάντος εξουσιοδοτείται στη συνέχεια στην ξεχωριστή κλάση. Frame Panel χειριστές συμβάντων του Panel και του Frame Button συμβάν πράξης χειριστής πράξης actionperformed(actionevent e) {... Τα συμβάντα είναι αντικείμενα που αναφέρονται μόνο στους καταχωρημένους listeners. Κάθε συμβάν έχει μία αντίστοιχη κλάση listener (διεπαφή). Η κλάση που υλοποιεί μία διεπαφή listener ορίζει κάθε μέθοδο που μπορεί να λάβει ένα αντικείμενο Event. Για παράδειγμα, στη συνέχεια είναι ένα απλό Frame με ένα μόνο Button πάνω του: import java.awt.*; import ButtonHandler; public class TestButton { public static void main(string args[]) { Frame f = new Frame( Test ); Button b = new Button( Press Me! ); b.addactionlistener(new ButtonHandler()); f.add( Center, b); f.pack(); f.setvisible(); Η κλάση ButtonHandler είναι η κλάση χειρισμού στην οποία θα εξουσιοδοτηθεί το συμβάν: import java.awt.event.*; public class ButtonHandler implements ActionListener { public void actionperformed(actionevent e) { System.out.println( Action occurred ); Η κλάση Button έχει μία μέθοδο addactionlistener(actionlistener) 3

Η διεπαφή ActionListener ορίζει μία μόνο μέθοδο, την actionperformed, η οποία θα λάβει ένα ActionEvent Όταν δημιουργείται το αντικείμενο Button, το αντικείμενο μπορεί να καταχωρήσει ένα listener για ActionEvents μέσω της μεθόδου addactionlistener, καθορίζοντας την κλάση αντικειμένων που υλοποιεί τη διεπαφή ActionListener. Όταν κάνουμε κλικ με το ποντίκι στο αντικείμενο Button, αποστέλλεται μία ActionEvent σε οποιονδήποτε ActionListener είναι καταχωρημένος μέσω της μεθόδου actionperformed(actionevent) Υπάρχουν αρκετά πλεονεκτήματα για την προσέγγιση αυτή: Τα συμβάντα δεν αντιμετωπίζονται τυχαία στο ιεραρχικό μοντέλο είναι πιθανό ένα συμβάν να προωθηθεί σε ένα container και να χειριστεί σε ένα επίπεδο όπου δεν αναμενόταν. Είναι δυνατό να δημιουργήσουμε κλάσεις φίλτρα (adapter) για να κατηγοριοποιούμε τις πράξεις συμβάντων Το μοντέλο εξουσιοδότησης είναι πολύ καλύτερο για την κατανομή της εργασίας ανάμεσα στις κλάσεις Το νέο μοντέλο συμβάντων παρέχει υποστήριξη για τα Java Beans TM Υπάρχουν επίσης ορισμένα ζητήματα/μειονεκτήματα στο μοντέλο τα οποία πρέπει να αναφέρουμε Είναι περισσότερο σύνθετο, τουλάχιστον στην αρχή, στην κατανόησή του. Η μεταφορά κώδικα από JDK 1.0 σε JDK 1.1 δεν είναι εύκολη Αν και το τρέχον JDK υποστηρίζει το μοντέλο συμβάντων του JDK 1.0 επιπρόσθετα στο μοντέλο εξουσιοδότησης, τα δύο μοντέλα αντικειμένων (JDK 1.0 και JDK 1.1) δεν μπορούν να αναμιχθούν. 8.3 Συμπεριφορά των GUI στη Java 8.3.1. Κατηγορίες συμβάντων Ο γενικός μηχανισμός για τη λήψη συμβάντων από components έχει περιγραφεί για τα συμφραζόμενα ενός απλού τύπου συμβάντος. Στο πακέτο java.awt.event ορίζεται ένα πλήθος συμβάντων και components τρίτων κατασκευαστών προσθέτουν σε αυτή τη λίστα. Για κάθε κατηγορία συμβάντων υπάρχει μία διεπαφή η οποία πρέπει να οριστεί για κάθε κλάση η οποία επιθυμεί να λαμβάνει τα συμβάντα. Η διεπαφή αυτή απαιτεί τον ορισμό μίας ή περισσοτέρων μεθόδων. Οι μέθοδοι αυτοί θα καλούνται όταν προκύψουν συγκεκριμένα συμβάντα. Ο επόμενος πίνακας παρουσιάζει τις κατηγορίες δίνοντας το όνομα της διεπαφής για κάθε μια από τις κατηγορίες, καθώς και τις απαιτούμενες μεθόδους. Τα ονόματα των μεθόδων είναι μνημονικά, δηλώνοντας τις συνθήκες που θα προκαλέσουν την κλήση της μεθόδου. Κατηγορία Όνομα διεπαφής Μέθοδοι Πράξη (action) ActionListener actionperformed(actionevent) 4

Κατηγορία Όνομα διεπαφής Μέθοδοι Στοιχείο (item) ItemListener itemstatechanged(itemevent) Κίνηση ποντικιού MouseMotionListener Πλήκτρο ποντικιού MouseListener mousedragged(mouseevent) mousemoved(mouseevent) mousepressed(mouseevent) mousereleased(mouseevent) mouseentered(mouseevent) mouseexited(mouseevent) mouseclicked(mouseevent) Πλήκτρα (key) KeyListener keypressed(keyevent) keyreleased(keyevent) keytyped(keyevent) Εστίαση (Focus) FocusListener focusgained(focusevent) focuslost(focusevent) Adjustment AdjustmentListener adjustmentvaluechanged(adjustmentevent) Component ComponentListener componentmoved(componentevent) componenthidden(componentevent) componentresized(componentevent) componentshown(componentevent) Window WindowListener windowclosing(windowevent) windowopened(windowevent) windowiconified(windowevent) windowdeiconified(windowevent) windowclosed(windowevent) windowactivated(windowevent) windowdeactivated(windowevent) Container ContainerListener componentadded(containerevent) componentremoved(containerevent) Text TextListener textvaluechanged(textevent) 8.3.2. Ένα περισσότερο σύνθετο παράδειγμα Στη συνέχεια θα δούμε ένα περισσότερο σύνθετο παράδειγμα. Θα παρακολουθεί την κίνηση του ποντικιού όταν είναι πατημένο το πλήκτρο το ποντικιού mouse dragging και επιπρόσθετα θα ανιχνεύει την κίνηση του ποντικιού. 5

Τα συμβάντα που προκαλούνται από την κίνηση του ποντικιού όσο είναι πατημένο το πλήκτρο μπορούν να λαμβάνονται από μία κλάση που υλοποιεί τη διεπαφή MouseMotionListener. Η διεπαφή απαιτεί να παρέχουμε δύο μεθόδους που είναι η mousedragged() και η mousemoved(). Ενδιαφερόμαστε μόνο για την κίνηση drag, αλλά παρ όλα αυτά πρέπει να παρέχουμε και τις δύο μεθόδους. Όμως το σώμα της mousemoved() μπορεί να είναι κενό. Για να λαμβάνουμε συμβάντα του ποντικιού, συμπεριλαμβανομένου του κλικ του ποντικιού, χρειάζεται να υλοποιήσουμε τη διεπαφή MouseListener. Η διεπαφή αυτή περιλαμβάνει αρκετά συμβάντα, συμπεριλαμβανομένων των mouseentered, mouseexited, mousepressed, mousereleased και mouseclicked. Όταν λαμβάνει χώρα ένα από τα συμβάντα drag ή κίνηση του ποντικιού, θα αναφέρουμε τη σχετική πληροφορία σε ένα text field. Ο κώδικας είναι ο ακόλουθος: import java.awt.*; import java.awt.event.*; public class TwoListen implements MouseMotionListener, MouseListener { private Frame f; private TextField tf; public static void main(string args[]) { TwoListen two = new TwoListen(); two.go(); public void go() { f = new Frame( Two listeners example ); f.add(new Label( Click and drag the mouse ), North ); tf = new TextField(30); f.add(tf, South ); f.addmousemotionlistener(this); f.addmouselistener(this); f.setsize(300,200); f.setvisible(true); // f.requestfocus(); // These are MouseMotionListener events public void mousedragged(mouseevent e) { String s = Mouse dragging: X = + e.getx() + Y = + e.gety(); tf.settext(s); 6

public void mousemoved(mouseevent e) { // These are MouseListener events public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { String s = The mouse entered ; tf.settext(s); public void mouseexited(mouseevent e) { String s = The mouse has left the building ; tf.settext(s); public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { Θα πρέπει να τονίσουμε ορισμένα στοιχεία σχετικά με το παράδειγμα Δήλωση πολλών διεπαφών Η κλάση δηλώνεται με χρήση του ακόλουθου implements MouseMotionListener, MouseListener Παρατηρήστε ότι μπορούμε να ορίσουμε πολλές διεπαφές χρησιμοποιώντας απλά το κόμμα ως διαχωριστή. Παρακολουθώντας πολλές πηγές Καλώντας τις επόμενες μεθόδους f.addmousemotionlistener(this); f.addmouselistener(this); δύο είδη συμβάντων προκαλούν την κλήση μεθόδων στην κλάση TwoListen. Μπορείτε να παρακολουθείτε (listen) όσες πηγές θέλετε, τόσο από διαφορετικές κατηγορίες συμβάντων όσο και από διαφορετικές πηγές, όπως διαφορετικά frames ή διαφορετικά buttons. 7

Λήψη λεπτομερειών σχετικά με το συμβάν Όταν καλούνται οι μέθοδοι χειρισμού, όπως η mousedragged(), λαμβάνουν ένα όρισμα που εν δυνάμει περιέχει σημαντική πληροφορία σχετικά με το αρχικό συμβάν. Για να καθορίσετε τις λεπτομέρειες του ποια πληροφορία είναι διαθέσιμη για κάθε κατηγορία συμβάντων θα πρέπει να ελέγξετε την τεκμηρίωση της κατάλληλης κλάσης από το πακέτο java.awt.event. 8.3.3. Πολλοί listeners Το πλαίσιο λειτουργίας της παρακολούθησης (listening) των AWT συμβάντων επιτρέπει να προσκολληθούν πολλοί listeners στο ίδιο component. Γενικά, αν θέλετε να γράψετε ένα πρόγραμμα που πραγματοποιεί πολλές πράξεις βασιζόμενο σε ένα μόνο συμβάν, πιθανότατα θα πρέπει να κωδικοποιήσετε αυτή τη συμπεριφορά στη μέθοδο χειρισμού. Όμως, ορισμένες φορές η σχεδίαση του προγράμματος απαιτεί πολλά μη σχετιζόμενα μεταξύ τους τμήματα του ίδιου προγράμματος να αντιδρούν στο ίδιο συμβάν. Αυτό μπορεί να συμβεί αν, για παράδειγμα, προσθέτουμε βοήθεια που εξαρτάται από τα συμφραζόμενα (context-sensitive help) σε ένα υπάρχον πρόγραμμα. Ο μηχανισμός του listener σάς επιτρέπει να καλείτε μία μέθοδο addlistener όσες φορές απαιτείται, καθορίζοντας όσους διαφορετικούς listener απαιτεί η σχεδίασή σας. Θα καλούνται οι μέθοδοι χειρισμού όλων των καταχωρημένων listeners όταν λάβει χώρα το συμβάν. Σημείωση Η σειρά με την οποία θα καλούνται οι μέθοδοι χειρισμού δεν είναι καθορισμένη. Γενικά, αν έχει σημασία η σειρά κλήσης, τότε οι χειριστές δεν είναι άσχετοι μεταξύ τους, και δε θα έπρεπε να χρησιμοποιείτε αυτή τη διευκόλυνση για την κλήση τους. Αντ αυτού, καταχωρήστε μόνο τον πρώτο listener και βάλτε τον να καλεί άμεσα τους άλλους. 8.4 Προσαρμοστές συμβάντων Προφανώς απαιτείται πολλή δουλειά για να υλοποιήσουμε όλες τις μεθόδους κάθε μιας από τις διεπαφές Listener, συγκεκριμένα των MouseListener και ComponentListener. Για παράδειγμα η διεπαφή MouseListener ορίζει τις επόμενες μεθόδους: mouseclicked(mouseevent) mouseentered(mouseevent) mouseexited(mouseevent) mousepressed(mouseevent) mousereleased(mouseevent) Ως βοήθεια η Java προσφέρει μία κλάση προσαρμοστή (adapter class) για κάθε διεπαφή Listener, η οποία υλοποιεί την αντίστοιχη διεπαφή Listener, αλλά αφήνει κενές τις μεθόδους που υλοποιήθηκαν. Με τον τρόπο αυτό η ρουτίνα Listener που ορίζεται μπορεί να κάνει extend την κλάση Adapter και να υπερβαίνει μόνο τις μεθόδους που χρειαζόσαστε. Για παράδειγμα: import java.awt.*; 8

import java.awt.event.*; public class MouseClickHandler extends MouseAdapter { // We just need the mouseclick handler, so we use // the Adapter to avoid having to write all the // event handler methods public void mouseclicked (MouseEvent e) { // Do stuff with the mouse click... 8.5 Ασκήσεις 8.5.1. Επίπεδο 1: GUI Αριθμομηχανής, Μέρος ΙΙ 1. Χρησιμοποιήστε τον κώδικα GUI που γράψατε στο προηγούμενο κεφάλαιο. 2. Γράψτε τον κώδικα συμβάντων που θα συνδέσει τη διεπαφή χρήστη της αριθμομηχανής με τους κατάλληλους χειριστές συμβάντων για τις πράξεις στην αριθμομηχανή. 8.5.2. Επίπεδο 3: GUI Λογαριασμών, Μέρος ΙΙ 1. Χρησιμοποιήστε το GUI για τους λογαριασμούς που γράψατε στο προηγούμενο κεφάλαιο. 2. Τροποποιήστε τον κώδικα ώστε να αποστέλλετε ένα αντικείμενο AccountEvent, ως αποτέλεσμα μίας αλλαγής στο λογαριασμό, στο αντικείμενο BankManager, που είναι ένας καταχωρημένος listener της διεπαφής AccountListener. 9