実際に、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;
}
......
......
}
-------------------------------------------------------------------------------