実際に、BeanInfoクラスをどのように利用するかを、BDKで提供されているサンプルを
見ながら説明したいと思います。${BDK_HOME}/demo/sunw/demo
というディレクトリ
に、サンプルのBeanのソースがあるはずです。ここでは、この中のbuttonsという
ディレクトリにある、OurButtonとExplicitButtonという二つのbeansの違いを、
BeansInfoの働きの違いとして見てみたいと思います。
最初に確認したいのは、この二つの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クラスの存在によってコントロールされているのです。
プロパティ・シートでエディットされるべきプロパティを指定するには、 その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()); } } ...... ...... } -------------------------------------------------------------------------------
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; } ...... ...... } -------------------------------------------------------------------------------