Η ενότητα αυτή περιγράφει ορισμένους κανόνες τους οποίους μπορείτε να χρησιμοποιείτε όταν εγγράφετε μια κλάση 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 στο αρχείο περιγραφής ιδιοτήτων ή εάν βρεθεί για το είδος της ιδιότητας, τότε η προβολή "Ιδιότητες" θα επιχειρήσει να προσδιορίσει το είδος της λειτουργίας επεξεργασίας που θα δημιουργήσει. Οι κανόνες που χρησιμοποιούνται είναι:
Για κάθε διεπαφή 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.
Η λίστα συμβάντων που εμφανίζεται σε ένα 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");