Συμβουλές για την εγγραφή κλάσεων BeanInfo για τη λειτουργία επεξεργασίας γραφικού περιβάλλοντος

Η ενότητα αυτή περιγράφει ορισμένους κανόνες τους οποίους μπορείτε να χρησιμοποιείτε όταν εγγράφετε μια κλάση BeanInfo για ένα Java bean, με σκοπό να τη χρησιμοποιήσετε στη λειτουργία επεξεργασίας γραφικού περιβάλλοντος για Java.

Η λειτουργία επεξεργασίας γραφικού περιβάλλοντος για Java χρησιμοποιεί αρχεία περιγραφής, τα οποία περιγράφονται στην κλάση BeanInfo για να δημιουργήσει τη λίστα καταχωρήσεων στην προβολή "Ιδιότητες" και να ορίσει τον τρόπο επεξεργασίας τους.

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

Όταν μια ιδιότητα είναι κρυφή, εξακολουθεί να χρησιμοποιείται από τη διαδικασία ανάλυσης κώδικα, αλλά δεν θα συμπεριλαμβάνεται σε καμία άλλη προβολή ή δυνατότητα της λειτουργίας επεξεργασίας γραφικού περιβάλλοντος. Το VisualAge for Java επέτρεπε την εξαίρεση μιας ιδιότητας από την προβολή "Ιδιότητες", αλλά αυτή εξακολουθούσε να είναι διαθέσιμη για άλλες λειτουργίες. Για παράδειγμα, η δημιουργία συνδέσεων, με ρύθμιση της ιδιότητας για το χρόνο σχεδίασης ως false. Παρόλο που η λειτουργία επεξεργασίας γραφικού περιβάλλοντος για Java δεν έχει τη δυνατότητα δημιουργίας συνδέσεων, η έννοια των ιδιοτήτων χρόνου σχεδίασης προωθείται. Για να ορίσετε την τιμή false για την ιδιότητα του χρόνου σχεδίασης, θα πρέπει να οριστεί μια τιμή γνωρίσματος με το κλειδί της κλάσης ivjDesignTimeProperty καθώς και η τιμή Boolean.FALSE.

Για παράδειγμα, εάν εγγράφετε μια κλάση BeanInfo για την κλάση MyJavaBean που διαθέτει μια ιδιότητα name (από ένα ζεύγος μεθόδων public void setName(String) και public String getName()), τότε θα μπορούσατε να εγγράψετε τη μέθοδο getPropertyDescriptors() ως εξής:

public PropertyDescriptor[] getPropertyDescriptors() { 
    PropertyDescriptor[] result = new PropertyDescriptor[1]; 
    try{ 
        PropertyDescriptor directionDescriptor = new
PropertyDescriptor("direction",MyJavaBean.class); 
        directionDescriptor.setValue("enumerationValues",new
Object[]{ 
            "North",new
Integer(myclasses.CompassPoint.NORTH),"myclasses.CompassPoint.NORTH",

            "East",new
Integer(myclasses.CompassPoint.EAST),"myclasses.CompassPoint.EAST",

            "South",new
Integer(myclasses.CompassPoint.SOUTH),"myclasses.CompassPoint.SOUTH",

            "West",new
Integer(myclasses.CompassPoint.WEST),"myclasses.CompassPoint.WEST"
        }); 
        result[0] = directionDescriptor; 
    } catch ( IntrospectionError exc ) { 
    } 
    return result;

Όταν επιλέγετε μία ιδιότητα στην προβολή "Ιδιότητες", τότε δημιουργείται μια λειτουργία επεξεργασίας στη στήλη "Τιμή" όπου μπορείτε να προσδιορίσετε μια νέα τιμή. Για τον υπολογισμό της λειτουργίας επεξεργασίας για μια ιδιότητα, υποβάλλεται ερώτημα στην κλάση java.beans.PropertyDescriptor για τη λειτουργία επεξεργασίας μιας ιδιότητας. Εάν βρεθεί συσχετισμένη λειτουργία επεξεργασίας της ιδιότητας, χρησιμοποιείται αυτή. Διαφορετικά, εντοπίζεται μία λειτουργία επεξεργασίας για την οποία ορίζεται η εργασία με το είδος της ιδιότητας. Δεν μπορείτε να παρέμβετε στη λίστα των προκαθορισμένων λειτουργιών επεξεργασίας ιδιοτήτων για ένα είδος. Εάν βρεθεί μια διεπαφή java.beans.PropertyEditor στο αρχείο περιγραφής ιδιοτήτων ή εάν βρεθεί για το είδος της ιδιότητας, τότε η προβολή "Ιδιότητες" θα επιχειρήσει να προσδιορίσει το είδος της λειτουργίας επεξεργασίας που θα δημιουργήσει. Οι κανόνες που χρησιμοποιούνται είναι:

  1. Αν η μέθοδος public boolean supportsCustomEdit() επιστρέψει την τιμή true, τότε δημιουργείται ένα πλαίσιο διαλόγου λειτουργίας επεξεργασίας. Το κουμπί του πλαισίου διαλόγου εκκινεί τη λειτουργία επεξεργασίας την οποία επιστρέφει η μέθοδος public Component getCustomEditor(). Η λειτουργία επεξεργασίας που επιστρέφεται θα πρέπει να είναι μια υπο-κλάση της java.awt.Component και θα εμπεριέχει ένα κουμπί OK και Ακύρωση σε Frame ή JFrame, όπως χρειάζεται.
  2. Αν η μέθοδος public String[] getTags() επιστρέφει έναν πίνακα σειρών χαρακτήρων, αυτοί εμφανίζονται σε μια λίστα. Η ετικέτα που χρησιμοποιείται για μια τιμή που υπάρχει στην προβολή "Ιδιότητες" είναι το αποτέλεσμα της κλήσης της μεθόδου public void setValue(Object) με την τιμή της ιδιότητας και στη συνέχεια, της κλήσης της μεθόδου public String getAsText() για τον προσδιορισμό της σειράς χαρακτήρων που θα χρησιμοποιηθεί. Καθώς επιλέγετε μια νέα τιμή στη λίστα, καλείται η μέθοδος public void setAsText(String) της λειτουργίας επεξεργασίας και η νέα τιμή ιδιότητας ανακτάται με τη χρήση της μεθόδου public Object getValue().
  3. Αν καμία από τις δύο παραπάνω μεθόδους δεν επιστρέφει μια προσαρμοσμένη λειτουργία επεξεργασίας ή προσδιοριστικά, τότε δημιουργείται μια λειτουργία επεξεργασίας πεδίου κειμένου στο φύλλο "Ιδιότητες". Η τιμή κειμένου που εμφανίζεται αρχικά είναι το αποτέλεσμα της κλήσης των μεθόδων public void setValue(Object) και public String getAsText(). Όταν εισάγετε μια νέα σειρά χαρακτήρων στη λειτουργία επεξεργασίας κειμένου σε κάθε πάτημα πλήκτρου, καλείται η μέθοδος public void setAsText(String). Αν η μέθοδος εμφανίσει ένα java.lang.IllegalArgumentException, το μήνυμα εξαίρεσης εμφανίζεται στη γραμμή κατάστασης και η τιμή δεν εφαρμόζεται. Αν δεν προκύψει εξαίρεση, όταν πατάτε το πλήκτρο Enter στη λειτουργία επεξεργασίας κειμένου (ή αν εστιάσετε σε άλλη ιδιότητα της προβολής "Ιδιότητες"), τότε το αποτέλεσμα της κλήσης της μεθόδου public Object getValue() μεταβιβάζεται ως όρισμα στη μέθοδο ορισμού που περιγράφεται στο αρχείο περιγραφής ιδιοτήτων.

Για κάθε διεπαφή java.beans.PropertyEditor πρέπει επίσης να προσδιορίζεται η μέθοδος public String getJavaInitializationString(). Αυτή επιστρέφει τη σειρά χαρακτήρων που χρησιμοποιείται στον πρωτογενή κώδικα Java ως όρισμα στη μέθοδο set του αρχείου περιγραφής ιδιοτήτων. Αυτή η σειρά χαρακτήρων θα επιστρέφει την τιμή, ενώ τα είδη στα οποία πραγματοποιείται παραπομπή στη σειρά χαρακτήρων θα προσδιορίζονται πλήρως και δεν θα εξαρτώνται από καμία πρόταση εισαγωγής της κλάσης η οποία δημιουργείται. Αν η κλάση σας BeanInfo προσδιορίζει την πρότυπη κλάση java.beans.SimpleBeanInfo του JRE, τότε η μέθοδος δεν είναι αφηρημένη και θα μεταβιβάζεται ώστε να επιστρέφει "???".. Δεν πρέπει να ξεχνάτε να την προσδιορίζετε σωστά.

Εκτός από τη χρήση της μεθόδου public String[] getTags() σε ένα αρχείο περιγραφής ιδιοτήτων για τη λήψη μιας λίστας, υπάρχει πιο σύντομος τρόπος ορισμού λίστας τιμών. Μια τιμή γνωρίσματος δημιουργείται με το κλειδί του γνωρίσματος enumerationValues, μια τιμή που αποτελεί έναν πίνακα τριπλότυπων καταχωρήσεων του displayName στη λίστα, την ίδια την τιμή και το initializationString. Για παράδειγμα, θεωρήστε μια ιδιότητα με το όνομα direction που δίνεται σε int και μπορεί να έχει τις τιμές 0,1, 2 και 3. Αυτές οι τιμές αποτελούν παραπομπές στα στατικά πεδία NORTH, EAST, SOUTH και WEST στην κλάση myclasses.CompassPoint. Το αρχείο περιγραφής ιδιοτήτων μπορεί να εγγραφεί ως εξής:

public PropertyDescriptor[] getPropertyDescriptors() {
    PropertyDescriptor[] result = new PropertyDescriptor[1];
    try{
        PropertyDescriptor directionDescriptor
= new PropertyDescriptor("direction",MyJavaBean.class);
        directionDescriptor.setValue("enumerationValues",new
Object[]{
           
"North",new
Integer(myclasses.CompassPoint.NORTH),"myclasses.CompassPoint.NORTH",
           
"East",new
Integer(myclasses.CompassPoint.EAST),"myclasses.CompassPoint.EAST",
           
"South",new
Integer(myclasses.CompassPoint.SOUTH),"myclasses.CompassPoint.SOUTH",
           
"West",new
Integer(myclasses.CompassPoint.WEST),"myclasses.CompassPoint.WEST"
        });
        result[0] = directionDescriptor;
    } catch ( IntrospectionError exc ) {
    }
    return result;
}

Η δεύτερη τιμή σε κάθε μία από τις καταχωρήσεις δεν είναι το ίδιο στατικό πεδίο της int, όπως το myclasses.CompoassPoint.NORTH αλλά μια χρήση του java.lang.Integer. Ο λόγος είναι ότι τα στοιχειώδη είδη δεν μπορούν να τοποθετηθούν σε πίνακα που δίνεται στην Object, επομένως θα πρέπει να χρησιμοποιηθούν τα java.lang equivalent.

Συμβάντα BeanInfo

Η λίστα συμβάντων που εμφανίζεται σε ένα Java bean αποτελεί το προτιμώμενο αρχείο περιγραφής μεθόδου στα αρχεία περιγραφής συμβάντων.

Αν υπάρχει μια διαθέσιμη κλάση προσαρμογέα, θα πρέπει να προστεθεί στο java.beans.EventDescriptor ως ένα επώνυμο γνώρισμα με ένα κλειδί της κλάσης "eventAdapterClass", για παράδειγμα

EventSetDescriptor focusEventSetDescriptor = new EventSetDescriptor(
  java.awt.Component.class,
  "focus",
  java.awt.event.FocusListener.class,
  new String[] { "focusGained(java.awt.event.FocusEvent)", "focusLost(java.awt.event.FocusEvent)" },
  "addFocusListener(java.awt.event.FocusListener)",
  "removeFocusListener(java.awt.event.FocusListener"
);
focusEventSetDescriptor.setValue("eventAdapterClass", "java.awt.event.FocusAdapter");

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