Προγραμματισμός

Εκδηλώσεις και ακροατές

Πώς δημιουργείτε ένα προσαρμοσμένο συμβάν και πώς το ενεργοποιείτε έτσι ώστε ένα στοιχείο να μπορεί να λάβει ένα συμβάν;

Πριν κοιτάξετε ένα προσαρμοσμένο συμβάν, ας δούμε ένα προϋπάρχον συμβάν: το Δράση.

Εξαρτήματα όπως το Κουμπί και JButton πυροβολήστε Εκδηλώσεις δράσης για να υποδείξει κάποιο είδος δράσης που καθορίζεται από στοιχεία. Για παράδειγμα, το Κουμπί πυροδοτεί ένα Δράση όποτε το πιέζει ο χρήστης. Ολόκληρο το σημείο μιας εκδήλωσης είναι να ενημερώσετε έναν ακροατή ότι κάτι συνέβη σε ένα στοιχείο στο GUI. Ένα συμβάν περιλαμβάνει όλες τις πληροφορίες που χρειάζεται ένας ακροατής για να καταλάβει τι συνέβη και σε ποιον συνέβη (το τι και ποιος του συμβάντος). Ένα συμβάν πρέπει να παρέχει αρκετές πληροφορίες για να περιγραφεί πλήρως. Με αυτόν τον τρόπο, ένας ακροατής μπορεί να καταλάβει τι ακριβώς συνέβη και να ανταποκριθεί με ουσιαστικό τρόπο.

ο Δράση περιλαμβάνει μεθόδους για την εκμάθηση συμβολοσειράς εντολών, τροποποιητών και συμβολοσειρών αναγνώρισης. ο getActionCommand () Η μέθοδος επιστρέφει τη συμβολοσειρά εντολών που υποδεικνύει την προβλεπόμενη ενέργεια του συμβάντος, όπως εκτύπωση ή αντίγραφο (το τι). ο getSource () Η μέθοδος επιστρέφει το αντικείμενο που δημιουργεί το συμβάν (το who).

Για να λάβετε ένα Δράση, ένας ακροατής πρέπει να εφαρμόσει το ActionListener διεπαφή και εγγραφείτε στο στοιχείο. Επιπλέον, ένα στοιχείο πρέπει να παρακολουθεί τους ακροατές του για να τους ειδοποιεί για ένα συμβάν.

Χρησιμοποιώντας το Δράση Για παράδειγμα ως μοντέλο, μπορούμε εύκολα να δούμε τα κομμάτια που είναι απαραίτητα για τη δημιουργία ενός συμβάντος από ένα στοιχείο και έναν ακροατή να ακούσει ένα συμβάν. Σε υψηλό επίπεδο, υπάρχουν τρία κομμάτια:

  1. Το συστατικό
  2. Το μάθημα της εκδήλωσης
  3. Η διεπαφή ακροατή

Ας ρίξουμε μια ματιά ξεχωριστά.

Το συστατικό

Τα στοιχεία δημιουργούν συμβάντα. Ένα γεγονός είναι ένας τρόπος για να ενημερώσουμε τον ακροατή ότι κάτι έχει συμβεί. Επομένως, ένα στοιχείο πρέπει να παρέχει έναν μηχανισμό για την εγγραφή και την κατάργηση της εγγραφής των ακροατών συμβάντων. Το στοιχείο πρέπει επίσης να παρακολουθεί τους ακροατές του και να μεταδίδει τα συμβάντα σε αυτούς τους ακροατές.

Οι μηχανισμοί εγγραφής / διαγραφής και παρακολούθησης αφήνονται στο μεμονωμένο στοιχείο. Ωστόσο, ένα στοιχείο θα έχει κανονικά ένα addXXXListener και removeXXXListener για κάθε τύπο συμβάντος που δημιουργεί. Εσωτερικά, το στοιχείο μπορεί να αποθηκεύσει έναν ακροατή, ωστόσο επιλέγει. συνήθως, ωστόσο, τα στοιχεία αποθηκεύουν τους ακροατές σε ένα java.util.Vector ή javax.swing.event.EventListenerList. Για να πυροδοτήσει ένα συμβάν στους ακροατές του, το στοιχείο απλώς περνά από τη λίστα των ακροατών του και μεταδίδει το συμβάν σε κάθε ακροατή καλώντας τη μέθοδο αποστολής συμβάντων του ακροατή.

Ήρθε η ώρα για ένα παράδειγμα:

... EventListenerList xxxListeners = νέο EventListnerList (); δημόσιο άκυρο addXXXListener (XXXListener listener) {xxxListeners.add (XXXListener.class, listener); } δημόσια ακύρωση removeXXXListener (XXXListener listener) {xxxListeners.remove (XXXListener.class, listener); } προστατευμένο άκυρο fireXXX (XXXEvent xxxEvent) {Object [] listeners = xxxListeners.getListenerList (); // περάστε από κάθε ακροατή και μεταβιβάστε το συμβάν, εάν χρειάζεται Int numListeners = listeners.length; για (int i = 0; i

Αυτό το παράδειγμα δείχνει τον τρόπο εγγραφής, κατάργησης εγγραφής και εκδήλωσης συμβάντων τύπου XXXΕκδήλωση. Οι ακροατές μπορούν να εγγραφούν και να καταργήσουν την εγγραφή τους μέσω του addXXXListener () και αφαίρεσηXXXListener () μεθόδους. Όταν συμβαίνει ένα συμβάν, το στοιχείο δημιουργεί ένα αντικείμενο συμβάντος και το μεταδίδει στο fireXXX () μέθοδο, όπου μεταδίδεται στους ακροατές.

Το παράδειγμα καθορίζει μια γενική συνταγή που μπορούν να ακολουθήσουν όλα τα συστατικά. Ωστόσο, για να λειτουργήσει το παράδειγμα, πρέπει να ορίσετε ένα XXXΕκδήλωση και ένα XXXListener διεπαφή.

Το μάθημα της εκδήλωσης

Η εκδήλωση περιέχει όλες τις απαραίτητες πληροφορίες για τον ακροατή να καταλάβει τι συνέβη. Οι πληροφορίες που περιλαμβάνονται είναι πραγματικά συγκεκριμένες εκδηλώσεις. Σκεφτείτε προσεκτικά την εκδήλωση και σχεδιάστε την τάξη της εκδήλωσης για να κρατήσετε ό, τι είναι απαραίτητη για να περιγράψετε πλήρως την εκδήλωση σε έναν ακροατή. Τα γεγονότα συνήθως επεκτείνουν το java.awt.AWTEvent τάξη εκδηλώσεων.

Η διεπαφή ακροατή

Μια διεπαφή ακροατή συμβάντων καθορίζει τις μεθόδους που χρησιμοποιούνται από ένα στοιχείο για την αποστολή συμβάντων. Κάθε τύπος συμβάντος θα έχει τουλάχιστον μία αντίστοιχη μέθοδο αποστολής σε μια διεπαφή ακροατή.

Μια διεπαφή ακροατή λαμβάνει την ακόλουθη γενική μορφή:

δημόσια διεπαφή Το XXXListener επεκτείνει το EventListener {// μεθόδους αποστολής συμβάντων κάτιHappened (XXXEvent e); κάτιElseHappened (XXXEvent e); ...} 

Για να ακούσετε ένα συμβάν, ένας ακροατής πρέπει να εφαρμόσει το XXXListener διασύνδεση και εγγραφή στο στοιχείο. Όταν συμβεί ένα συμβάν, το στοιχείο θα καλέσει τη σωστή μέθοδο αποστολής. Οι μέθοδοι ορίζονται σε μια διεπαφή έτσι ώστε οποιοδήποτε αντικείμενο να μπορεί να λάβει το συμβάν. Εφόσον ο ακροατής εφαρμόζει τη διεπαφή, το στοιχείο θα γνωρίζει πώς να αποστείλει το συμβάν στον ακροατή.

Τύλιξε

Όπως μπορείτε να δείτε, υπάρχουν εξαρτήσεις μεταξύ μερικών από τα κομμάτια. Η διεπαφή ακροατή αντιστοιχεί απευθείας στο συμβάν. Το συμβάν είναι απαραίτητα το επιχείρημα της μεθόδου αποστολής.

Το στοιχείο αντιστοιχεί απευθείας στο συμβάν και τον ακροατή. Πρέπει να ξέρει για κάθε ένα έτσι ώστε να μπορεί να δημιουργεί συμβάντα, να αποστέλλει συμβάντα και να εγγράφει ακροατές.

Σε αντίθεση με τα άλλα δύο κομμάτια, το αντικείμενο συμβάντος είναι ανεξάρτητο. Ως αποτέλεσμα, πολλά στοιχεία είναι ελεύθερα να ενεργοποιήσουν τον τύπο της εκδήλωσης. Επιπλέον, πολλαπλές διεπαφές μπορεί να ορίζουν μεθόδους για την αποστολή του συμβάντος.

Ο Tony Sintes είναι κύριος σύμβουλος της BroadVision. Ο Tony, ένας προγραμματιστής Java 1.1 και προγραμματιστής Java 2, πιστοποιημένος από την Sun, συνεργάζεται με την Java από το 1997.

Αυτή η ιστορία, "Εκδηλώσεις και ακροατές" δημοσιεύθηκε αρχικά από το JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found