これまでの例は、beanのプロパティがIntrospectionで探されて、条件を満たした プロパティが BeanBoxのプロパティ・シートに表示されるというものでした。 beanの種類によっては、こうして得られる全てのプロパティを編集する必要が無いもの がありえます。 BeanBoxのサンプルの中では、OurButtonとExplicitButtonの関係が その例の一つになっていました。
このコントロールには、BeanInfoクラスを用います。 ここでは、BeanInfoを使って、プロパティの表示をコントロール出来ることを 学びます。
次のものは。fileNameという名前のプロパティに設定された文字列を、ファイル名と 解釈して、その内容をTextAreaに表示する簡単なbeanです。
==================================================================
import java.awt.*;
import java.io.*;
public class MyViewer extends TextArea {
String fileName="";
public void setFileName(String s){
fileName = s ;
loadFile(s);
setEditable(false);
setVisible(true);
}
public String getFileName(){
return fileName;
}
void loadFile(){
if ( fileName.length() == 0 ) return ;
try {
BufferedReader in
= new BufferedReader(new FileReader( fileName ));
setText("");
String line = "" ;
String text = "" ;
while( (line = in.readLine()) != null ){
text += line + "\n" ;
}
setText(text);
} catch (Exception ex){
System.out.println("Exception : " + ex );
}
}
}
==================================================================
このクラスをbeanとしてBeanBoxにかけると、沢山のプロパティが表示されます。 今回は、この表示をfileNameプロパティだけにしてみようと思います。
まず、bean名+BeanInfoというクラスを同じディレクトリ内に作ります。 この例の場合でしたら、MyViewerBeanInfoというクラスを作る必要があります。 次がそのリストです。
==================================================================
import java.beans.*;
public class ViewerBeanInfo extends SimpleBeanInfo {
private final static Class beanClass = Viewer.class;
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor fileName =
new PropertyDescriptor("fileName", beanClass);
fileName.setBound(true);
PropertyDescriptor rv[] = { fileName };
return rv;
} catch (IntrospectionException e) {
throw new Error(e.toString());
}
}
}
==================================================================
SimpleBeanInfoは、それ自身は何の情報も持っていませんが、それを拡大・継承する ことで、新しい情報を追加することが出来ます。この例では、BeanInfoからプロパティ 情報を取り出す getPropertyDescriptorsメソッドが置き換わっています。 BeanBoxは、対応するBeanInfoがある場合には、全てのプロパティを表示するのでは なく、このgetPropertyDescriptorsメソッドが返すプロパティのみを表示します。