Συμβάντα, λειτουργίες ακρόασης και κλάσεις προσαρμογέων

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

Η λίστα των καθορισμένων συμβάντων για ένα JavaBean περιγράφεται στην κλάση BeanInfo, η οποία ελέγχει επίσης τα προτιμώμενα ή τα συνηθισμένα συμβάντα.

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

Συνήθως, αν ο πρωτογενής κώδικας JavaBean έχει μέθοδο ΧΧΧ, υπάρχει μια διεπαφή λειτουργίας ακρόασης, ΧΧΧListener, καθώς και δύο μέθοδοι. Είναι σημαντικό η λειτουργία XXXListener να επεκτείνει την κλάση java.util.EventListener. Αν δεν συμβαίνει αυτό, το συμβάν δεν θα εντοπιστεί, εκτός και αν έχει δοθεί μια συγκεκριμένη κλάση BeanInfo.

Οι μέθοδοι στη διεπαφή XXXListener εξαρτώνται από τη σημασιολογία του συμβάντος, ωστόσο η σύμβαση για την υπογραφή είναι void <eventOccurenceMethodName>(<EventStateObjectType> evt);. Είναι σημαντικό η λειτουργία XXXListener να επεκτείνει την κλάση java.util.EventObject. Αν δεν συμβαίνει αυτό, το συμβάν δεν θα εντοπιστεί, εκτός και αν έχει δοθεί μια συγκεκριμένη κλάση BeanInfo.

Ένα παράδειγμα συμβάντος είναι το JavaBean java.awt.Component, το οποίο προκαλεί συμβάντα όταν το ποντίκι κινείται πάνω από αυτό. Η διεπαφή λειτουργίας ακρόασης java.awt.event.MouseMotionListener υλοποιεί τις ακόλουθες δύο μεθόδους:

Για να προσθέσετε μια λειτουργία ακρόασης ποντικιού, το java.awt.Component έχει τις δύο ακόλουθες μεθόδους:

Το δεύτερο στυλ συμβάντος δημιουργείται από ένα JavaBean όταν αλλάζει μια τιμή ιδιότητας. Ένα τέτοιο παράδειγμα είναι η ιδιότητα "ενεργοποιημένο" σε javax.swing.JButton. Η ιδιότητα που ενεργοποιεί ένα συμβάν όταν η τιμή αλλάζει, ονομάζεται ιδιότητα ορίου. Αντί να υπάρχει μια ξεχωριστή διεπαφή λειτουργίας ακρόασης για κάθε ιδιότητα ορίου, υπάρχει μια γενική διεπαφή java.beans.PropertyChangeListener που έχει μια μοναδική μέθοδο επανάκλησης void propertyCanged(PropertyChangeEvent evt); Το όρισμα PropertyChangeEvent διαθέτει τρεις μεθόδους στις οποίες μπορούν να υποβληθούν ερωτήματα από τη λειτουργία λήψης της μεθόδου:

String getPropertyName() Το όνομα της ιδιότητας που άλλαξε σε εκείνο το JavaBean που ενεργοποίησε το συμβάν.
Object getNewValue() Η νέα τιμή της ιδιότητας
Object getOldValue() Η τιμή της ιδιότητας πριν την αλλαγή

Για να δηλώσετε ενδιαφέρον για τις αλλαγές ιδιότητας ενός JavaBean υπάρχουν δύο μέθοδοι: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

Η πρώτη μέθοδος βρίσκεται πάντα σε ένα JavaBean που έχει ιδιότητες ορίων. Ωστόσο, η δεύτερη μέθοδος είναι προαιρετική και εξαρτάται από το στυλ της καταχώρησης συμβάντος που χρησιμοποιεί ο συντάκτης του JavaBean. Για παράδειγμα, τα συστατικά στοιχεία AWT χρησιμοποιούν το πρώτο στυλ καταχώρησης αλλαγής ιδιότητας, ενώ τα συστατικά στοιχεία Swing χρησιμοποιούν και τα δύο στυλ.

Για να χρησιμοποιήσετε ένα συμβάν υπάρχουν τρία αντικείμενα:

  1. Το JavaBean που προκαλεί το συμβάν ( ο πρωτογενής κώδικας )
  2. Η κλάση που λαμβάνει ειδοποίηση από τον πρωτογενή κώδικα (η λειτουργία ακρόασης )
  3. Η κλάση που υλοποιεί τη λογική που προκύπτει κατά την επανάκληση της λειτουργίας ακρόασης.

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

Κλάσεις προσαρμογέα

Πολλές διεπαφές λειτουργίας ακρόασης έχουν περισσότερες από μία μεθόδους επανάκλησης. Ένα τέτοιο παράδειγμα είναι η λειτουργία java.awt.FocusListener η οποία έχει δύο μεθόδους; focusGained (συμβάν java.awt.FocusEvent) και focusLost (συμβάν java.awt.FocusEvent). Κατά τη δημιουργία μιας κλάσης λειτουργίας ακρόασης που υλοποιεί τη διεπαφή, ο μεταγλωττιστής Java επιμένει στην υλοποίηση όλων των μεθόδων διεπαφών, γεγονός που συχνά έχει ως αποτέλεσμα τη δημιουργία πολλών κενών μεθόδων για την ικανοποίηση των απαιτήσεών του, όταν μόνο μία ή ορισμένες από τις μεθόδους περιέχουν στην πραγματικότητα κώδικα. Η ακόλουθη πρόταση παρουσιάζει μια λειτουργία FocusListener που χρησιμοποιείται για την εκτέλεση μιας λογικής, όταν έχει αυξηθεί η εστίαση σε ένα Java bean. Ωστόσο, πρέπει να παρέχεται και μια κενή μέθοδος focusLost.

javaBean.addFocusListener(new java.awt.event.FocusListener() {     
    public void focusGained(java.awt.event.FocusEvent e) {         
        doFocusGainedCode();     
     }         
        public void focusLost(java.awt.event.FocusEvent e) {     
     }
});

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

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {    
     public void focusGained(java.awt.event.FocusEvent e) {         
         doFocusGainedCode();     
         }
   });
Σχετικές εργασίες
Προβολή συμβάντων για συστατικό στοιχείο
Προσθήκη συμβάντων σε συστατικό στοιχείο
Διαγραφή συμβάντων από συστατικό στοιχείο
Προβολή του κώδικα για συμβάν

(C) Copyright IBM Corporation 1999, 2004. Με την επιφύλαξη παντός δικαιώματος.