Visual Editor の BeanInfo クラスの作成のヒント

このセクションでは、Visual Editor for Java で使用する予定の Java Bean 用 BeanInfo クラスを作成する場合に採用可能な規則について説明します。

Visual Editor for Java は、BeanInfo クラスで記述されているプロパティー記述子を使用して、「プロパティー」ビュー内のエントリーの編集方法に加えて、そのエントリーのリストを設定します。

java.beans.PropertyDescriptor が非表示の場合、プロパティー・ビューアーで使用することはできません。 しかし、非表示プロパティーの set メソッドはコード生成プログラムで構文解析され、 ライブ Bean に適用されます。

プロパティーは、表示されていなくてもコード構文解析で使用されますが、他の Visual Editor のビューやフィーチャーに組み込まれることはありません。 VisualAge for Java では、プ ロパティーを「プロパティー」ビューから除外し、他の機能については有効にしておくことが可能でした。 例えば、設計時を「」に指定することによって接続します。 Visual Editor for Java には接続機能がありませんが、 設計時プロパティーの概念は引き継がれます。 設計時プロパティーを「偽」にするには、ivjDesignTimeProperty の キーと Boolean.FALSE. の値を使用して属性値を設定する必要があります。

例えば、(public void setName(String) と public String getName() メソッドのペアからの) name プロパティーを持つクラス MyJavaBean 用に BeanInfo クラスを作成する場合、 getPropertyDescriptors() メソッドを次のように記述できます。

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

「プロパティー」ビューでプロパティーが選択されると、「値」列にエディターが作成され、 新しい値を指定できます。 プロパティーのエディターを計算するために、java.beans.PropertyDescriptor がプロパティー・エディターを持っているかどうか照会されます。 関連プロパティー・エディターが見つかると、それが使用されます。 見つからない場合は、プロパティー・タイプで使用できるように定義されているエディターを見つけます。 タイプの事前定義プロパティー・エディターのリストに手を加えることはできません。 プロパティー記述子に java.beans.PropertyEditor があるか、またはプロパティー・タイプに定義されている場合、 「プロパティー」ビューは作成するエディターのタイプの判別を試みます。 使用される規則は、次のとおりです。

  1. public boolean supportsCustomEdit() メソッドが true を戻す場合、ダイアログ・エディターが作成されます。ダイアログ・ボタンを押すと、public Component getCustomEditor() メソッドから戻されたエディターが起動されます。 戻されるエディターは java.awt.Component のサブクラスでなければなりません。 これは、必要に応じて、Frame または JFrame の「OK」および「キャンセル」ボタンでホスティングされます。
  2. public String[] getTags() メソッドがストリングの配列を戻した場合、 それらのストリングはリストで示されます。「プロパティー」ビューの既存値に使用されるラベルは、 そのプロパティー値で public void setValue(Object) を呼び出し、 さらに使用するストリングを判別するために public String getAsText() を呼び出した結果です。 リストで新しい値を選択すると、エディターの public void setAsText(String) メソッドが呼び出され、public Object getValue() を使用してその新しいプロパティー値が検索されます。
  3. 上記の 2 つのメソッドがどちらもカスタム・エディターまたはタグを戻さない場合、 プロパティー・シートにテキスト・フィールド・エディターが作成されます。 最初に表示されるテキスト値は、 public void setValue(Object) および public String getAsText() を呼び出した結果です。それぞれのキー・ストロークでテキスト・エディターに新しいストリングを入力すると、 public void setAsText(String) メソッドが呼び出されます。メソッドが java.lang.IllegalArgumentException をスローすると、 例外メッセージが状況バーに表示され、値は適用されません。テキスト・エディターで Enter キーを押したときに例外がスローされない場合 (または、「プロパティー」ビューの別のプロパティーがフォーカスを受け取った場合)、 public Object getValue() を呼び出した結果が、プロパティー記述子に記述されている set メソッドへの引き数として送信されます。

すべての java.beans.PropertyEditor について、 public String getJavaInitializationString() メソッドも指定する必要があります。これにより、プロパティー記述子の set メソッドへの引き数として Java ソース・コードで使用されるストリングが戻されます。このストリングは値を戻し、ストリングで参照されるいずれのタイプも完全修飾されていなければならず、さらに作成されるクラスのいずれのインポート・ステートメントにも依存しません。BeanInfo が java.beans.SimpleBeanInfo テンプレート JRE クラスを特殊化する場合、 メソッドは抽象でないため、継承では「???」を戻します。 したがって、特殊化は正しく行う必要があります。

リストを入手するために、 プロパティー記述子の public String[] getTags() メソッドを使用することだけでなく、 値のリストの指定を簡単にする方法もあります。 属性値は、enumerationValues というキー、 リスト内にある displayName の 3 対のエントリーの配列である値、値自体、および initializationString で作成されます。例えば、int 型になる direction と呼ばれるプロパティーを考えてみます。 このプロパティーには 0、1、2、および 3 という値が割り当てられます。 これらは、myclasses.CompassPoint クラスで NORTH、EAST、SOUTH、WEST static フィールドを参照します。プロパティー記述子は、次のように作成できます。

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

各エントリーの 2 番目の値は、int 静的フィールド 自体 (例えば myclasses.CompoassPoint.NORTH) ではなく、java.lang.Integer のインスタンスです。 これは、Object 型の配列にプリミティブ型を入れることができないためです。 そのため、それぞれの java.lang 等価 を使用する必要があります。

BeanInfo イベント

Java Bean に表示されるイベント・リストは、そのイベント記述子に関する優先メソッド記述子です。

アダプター・クラスが使用可能な場合は、 このリストは、「eventAdapterClass」キーを持つ名前付き属性として、java.beans.EventDescriptor に追加する必要があります。 以下はその例です。

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");

親トピック: BeanInfo クラスとイントロスペクション

関連タスク
プラグイン開発者のための BeanInfo 情報の制御
BeanInfo クラスのロケーションの指定

(C) Copyright IBM Corporation 1999, 2004. All Rights Reserved.