Vihjeitä BeanInfo-luokkien kirjoitukseen graafisessa muokkausohjelmassa

Tässä osassa on kuvaus joistakin säännöistä, joita voit käyttää, jos kirjoitat graafisessa Java-muokkausohjelmassa käytettäväksi tarkoitettua BeanInfo-luokkaa.

Graafinen Java-muokkausohjelma käyttää BeanInfo-luokassa kuvattuja ominaisuuskuvaajia Ominaisuudet-näkymän määritysluettelon muodostukseen ja määritysten muokkaustapojen määritykseen.

Jos metodi java.beans.PropertyDescriptor on piilotettu, se ei ole käytettävissä Ominaisuudet-tarkastelutoiminnolla. Koodinmuodostustoiminto voi kuitenkin jäsentää piilotettujen ominaisuuksien määritysmetodit, ja ne otetaan käyttöön toiminnassa olevissa bean-komponenteissa.

Kun ominaisuus on piilotettu, sitä käytetään edelleen koodin jäsennyksessä, mutta sitä ei sisällytetä mihinkään muuhun graafisen muokkausohjelman näkymään tai ominaisuuteen. VisualAge for Java on sallinut ominaisuuden poisjätön Ominaisuudet-näkymästä, mutta ominaisuus on vielä muiden toimintojen käytettävissä. Esimerkiksi yhteyksiä voi muodostaa määrittämällä sen suunnitteluajan arvoksi epätosi. Vaikka graafisella Java-muokkausohjelmalla ei ole yhteydenmuodostustoimintoa, suunnitteluaikaominaisuuksien käsite siirretään eteenpäin. Jos haluat määrittää ominaisuuden suunnitteluajan arvon epätodeksi, määritä määritearvo, jonka avain on ivjDesignTimeProperty ja arvo Boolean.FALSE.

Jos BeanInfo-luokkaa kirjoitetaan esimerkiksi MyJavaBean-luokalle, jolla on nimiominaisuus (yleisestä void-määrityksestä setName(String) ja yleisestä metodiparista String getName()), metodin getPropertyDescriptors() voi kirjoittaa seuraavasti:

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;
}

Kun ominaisuus on valittu Ominaisuudet-näkymästä, muokkausohjelma luodaan Arvo-sarakkeeseen, johon voit määrittää uuden arvon. Ominaisuuden muokkausohjelma lasketaan tekemällä ominaisuuden muokkausohjelman kysely java.beans.PropertyDescriptor-metodille. Jos liittyvä ominaisuuden muokkausohjelma löytyy, sitä käytetään. Muussa tapauksessa järjestelmä paikantaa muokkausohjelman, joka on määritetty toimimaan ominaisuustyypin kanssa. Et voi vaikuttaa ennalta määritettyyn tyypille soveltuvien ominaisuuden muokkausohjelmien luetteloon. Jos java.beans.PropertyEditor-metodi löytyy ominaisuuden kuvaajasta tai se on olemassa ominaisuustyypille, Ominaisuudet-näkymä yrittää määrittää luotavan muokkausohjelman tyypin. Käytetyt säännöt ovat seuraavat:

  1. Jos metodi public boolean supportsCustomEdit() palauttaa arvon true, valintaikkunan muokkausohjelma luodaan. Valintaikkunan painike käynnistää muokkausohjelman, joka on palautettu metodista public Component getCustomEditor(). Palautetun muokkausohjelman tulee olla metodin java.awt.Component aliluokka, ja sen mukana tulee OK- ja Peruuta-painike Frame- tai JFrame-kehyksessä tarpeen mukaan.
  2. Jos metodi public String[] getTags() palauttaa useita merkkijonoa, ne näytetään luettelossa. Ominaisuudet-näkymässä olevan aiemmin määritetyn arvon nimiö saadaan kutsumalla metodi public void setValue(Object) ominaisuusarvolla ja määrittämällä sitten käytettävä merkkijono kutsumalla metodi public String getAsText(). Kun valitset uuden arvon luettelosta, muokkausohjelman metodi public void setAsText(String) kutsutaan, ja uusi ominaisuusarvo noudetaan metodilla public Object getValue().
  3. Jos kumpikaan yllä mainituista metodeista ei palauta mukautettua muokkausohjelmaa tai tunnisteita, tekstikentän muokkausohjelma luodaan Ominaisuudet-sivulle. Alunperin näkyvissä oleva tekstiarvo saadaan kutsumalla metodit public void setValue(Object) ja public String getAsText(). Metodia public void setAsText(String) kutsutaan sitä mukaa kuin uutta merkkijonoa syötetään tekstin muokkausohjelmaan. Jos metodi tuottaa poikkeuksen java.lang.IllegalArgumentException, poikkeussanoma tulee näkyviin tilariville. Arvoa ei oteta käyttöön. Jos poikkeusta ei tule, voit painaa Enter-näppäintä tekstin muokkausohjelmassa (tai valita jonkin muun mahdollisesti tarkennettuna näkyvän ominaisuuden Ominaisuudet-näkymässä), jolloin metodin public Object getValue() kutsun tulos lähetetään argumenttina ominaisuuden kuvaajassa kuvattuun määritysmetodiin.

Jokaiselle java.beans.PropertyEditor-metodin metodille public String getJavaInitializationString() on myös määritettävä omat asetuksensa. Tämä palauttaa merkkijonon, jota käytetään Java-lähdekoodissa ominaisuuden kuvaajan set-määritysmetodiin viittaavana argumenttina. Tämän merkkijonon tulee palauttaa arvo, ja kaikkien merkkijonossa viitattujen tyyppien tulee olla täysin tarkennettuja, eivätkä ne saa perustua koostettavassa luokassa oleviin tuotuihin lauseisiin. Jos BeanInfo käyttää JRE-mallipohjaluokkaa java.beans.SimpleBeanInfo, metodi ei ole erillinen, ja se palauttaa perittynä arvon ???. Muista määrittää sen omat määritykset oikein.

Luettelon voi muodostaa käyttämällä metodia public String[] getTags() ominaisuuden kuvaajassa, mutta arvoluettelon voi määrittää helpomminkin. Määritearvo luodaan avaimella enumerationValues. Tämä on arvo, joka on kokoelma kolmenlaisia merkintöjä: luettelossa olevat displayName-merkinnät, itse arvo ja initializationString-merkintä. Oletetaan esimerkiksi, että kutsut ominaisuuden direction, jonka tyyppi on int ja jolle voi määrittää arvot 0, 1, 2 ja 3. Nämä ovat viittauksia staattisiin kenttiin NORTH, EAST, SOUTH ja WEST luokassa myclasses.CompassPoint. Ominaisuuden kuvaajan voi kirjoittaa seuraavasti:

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;
}

Kunkin määrityksen toinen arvo ei ole itsessään staattinen int-kenttä, kuten myclasses.CompoassPoint.NORTH, vaan metodin java.lang.Integer ilmentymä. Tämä johtuu siitä, että alkeistyyppejä ei voi viedä taulukkoon, jonka tyyppi on Object, joten sen sijaan on käytettävä niiden metodia java.lang equivalent.

BeanInfo-tapahtumat

Java-bean-komponentissa näkyvä tapahtumaluettelo on sen tapahtumakuvaajien ensisijainen metodikuvaaja.

Jos sovitinluokka on saatavilla, se tulee lisätä metodiin java.beans.EventDescriptor nimettynä määritteenä, jolla on avain "eventAdapterClass". Esimerkki:

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. All rights reserved.