next up previous contents
Next: Bound Property と Up: BeanInfo Previous: BeanInfoからの情報の獲得

BeanInfoクラスの利用

実際に、BeanInfoクラスをどのように利用するかを、BDKで提供されているサンプルを 見ながら説明したいと思います。${BDK_HOME}/demo/sunw/demo というディレクトリ に、サンプルのBeanのソースがあるはずです。ここでは、この中のbuttonsという ディレクトリにある、OurButtonとExplicitButtonという二つのbeansの違いを、 BeansInfoの働きの違いとして見てみたいと思います。

OurButtonとExplicitButton

最初に確認したいのは、この二つのbeansは、内応的には同じものだということです。 次のリストを見てください。

public class ExplicitButton extends OurButton {
}

要するに、ExplicitButtonクラスは、OurButtonクラスを継承したものなのですが、 新たに付け加えられたフィールドもメソッドもありません。

ところが、この二つのbeansのbeanboxでの振る舞いは、明確に異なります。 少し、細かくなりますが、その違いをまとめてみました。

第一に、プロパティ・シートの内容が異なっています。OurButtonでは、 foreground,label,background,fontSize,font,largeFont,debugという7つのプロパティ のエントリがありますが、ExplicitButtonでは、そのエントリは、foreground,label, background,fontの4つです。

第二に、BeanBoxのEditメニューの内容が異なります。OurButtonでは存在しないの ですが、ExplicitButtonでは、Customize... という項目が追加されています。

第三に、同じく、EditメニューのEvents項目の内容が異なります。OurButtonでは たくさんのイベントがありますが、ExplicitButtonでは、二つのエントリしか みえません。

第四に、細かいことですが、toolbox中で、ExplicitButtonにはアイコンがついて いるのにたいして、OurButtonには、それが欠けています。

実は、これら全てが、ExplicitButtonクラスではなく、ExplicitButtonBeanInfoと いうBeanInfoクラスの存在によってコントロールされているのです。

Propertyの記述

プロパティ・シートでエディットされるべきプロパティを指定するには、 そのbeanに対応するBeanInfoクラスのgetPropertyDescriptorsメソッドが、 これらのプロパティのディスクリプタの配列を返すようにします。 次のリストは、ExplicitButtonに対応するExplicitButtonBeanInfoでの、 getPropertyDescriptorsの定義です。4つのプロパティが選ばれているのが 分かります。

-------------------------------------------------------------------------------
public class ExplicitButtonBeanInfo extends SimpleBeanInfo {
    ......
    ......
    public PropertyDescriptor[] getPropertyDescriptors() {
        try {
            PropertyDescriptor background =
                        new PropertyDescriptor("background", beanClass);
            PropertyDescriptor foreground =
                        new PropertyDescriptor("foreground", beanClass);
            PropertyDescriptor font =
                        new PropertyDescriptor("font", beanClass);
            PropertyDescriptor label =
                        new PropertyDescriptor("label", beanClass);

            background.setBound(true);
            foreground.setBound(true);
            font.setBound(true);
            label.setBound(true);

            PropertyDescriptor rv[] = {background, foreground, font, label};
            return rv;
        } catch (IntrospectionException e) {
            throw new Error(e.toString());
        }
    }
    ......
    ......
}
-------------------------------------------------------------------------------

customizerの指定

beanにcustomizerを指定するには、対応するBeanInfoクラスで定義される getBeanDescriptorメソッドが、そのcustomizerをもったBeanDescriptorを 返すようにします。この時、自動的にEditメニューにエントリーが追加されます。

-------------------------------------------------------------------------------
public class ExplicitButtonBeanInfo extends SimpleBeanInfo {

    private final static Class beanClass = ExplicitButton.class;
    private final static Class customizerClass = OurButtonCustomizer.class;

    public BeanDescriptor getBeanDescriptor() {
        return new BeanDescriptor(beanClass, customizerClass);
    }
    ......
    ......
}
-------------------------------------------------------------------------------

イベントの記述

選択可能なイベントセットの記述には、同じく、対応するBeanInfoクラスの getEventSetDescriptorsメソッドが、必要なイベントセットのディスクリプタを 返すようにします。次の例は、ExplicitButtonBeanInfoでの、このメソッドの 定義です。

-------------------------------------------------------------------------------
public class ExplicitButtonBeanInfo extends SimpleBeanInfo {
    ......
    ......
    public EventSetDescriptor[] getEventSetDescriptors() {
        try {
            EventSetDescriptor push = new EventSetDescriptor(beanClass, 
                        "actionPerformed",
                        java.awt.event.ActionListener.class,
                        "actionPerformed");

            EventSetDescriptor changed = new EventSetDescriptor(beanClass,
                        "propertyChange",
                        java.beans.PropertyChangeListener.class,
                        "propertyChange");

            push.setDisplayName("button push");
            changed.setDisplayName("bound property change");
        
            EventSetDescriptor[] rv = { push, changed};
            return rv;
        } catch (IntrospectionException e) {
            throw new Error(e.toString());
        }
    }
    ......
    ......
}
-------------------------------------------------------------------------------

アイコンの指定

beanのアイコンを指定するにも、BeanInfoクラスのgetIconメソッドを使います。

-------------------------------------------------------------------------------
public class ExplicitButtonBeanInfo extends SimpleBeanInfo {
    ......
    ......
    public java.awt.Image getIcon(int iconKind) {
        if (iconKind == BeanInfo.ICON_MONO_16x16 ||
            iconKind == BeanInfo.ICON_COLOR_16x16 ) {
            java.awt.Image img = loadImage("ExplicitButtonIcon16.gif");
            return img;
        }
        if (iconKind == BeanInfo.ICON_MONO_32x32 ||
            iconKind == BeanInfo.ICON_COLOR_32x32 ) {
            java.awt.Image img = loadImage("ExplicitButtonIcon32.gif");
            return img;
        }
        return null;
    }
    ......
    ......
}
-------------------------------------------------------------------------------


maruyama@wakhok.ac.jp