비주얼 편집기에서 BeanInfo 클래스를 쓸 경우의 팁

이 섹션에서는 Visual Editor for Java에서 사용할 Java Bean의 BeanInfo 클래스를 쓰는 경우 사용할 수 있는 몇 가지 규칙을 설명합니다.

Visual Editor for Java는 BeanInfo 클래스에 설명된 특성 설명자를 사용하여 특성 보기의 항목 목록 및 이러한 항목의 편집 방법을 설정합니다.

java.beans.PropertyDescriptor가 숨겨지면 특성 표시기 내에서 사용할 수 없습니다. 그러나 숨겨진 특성의 Set 메소드는 여전히 코드 생성기로 구문 분석되고 활성 Bean에 적용됩니다.

특성이 숨겨져 있어도 코드 구문 분석에는 사용되지만 다른 비주얼 편집기 보기 또는 기능에는 포함되지 않습니다. VisualAge for Java를 사용하여 특성 보기에서 특성을 제외할 수 있지만 다른 기능에서는 계속 사용할 수 있습니다. 예를 들어, 디자인 시간을 false로 만들어서 연결을 설정하는 것. Visual Editor for Java에 연결 성능이 없어도 디자인 시간 특성 개념은 계속 수행됩니다. 특성 디자인 시간을 false로 하려면 속성 값을 ivjDesignTimeProperty 키 및 Boolean.FALSE 값으로 설정해야 합니다.

예를 들어, 이름 특성(public void setName(String) 및 public String getName() 메소드 쌍에서)이 있는 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의 서브클래스이어야 하고, 필요에 따라 프레임 또는 JFrame에서 확인취소 단추로 호스트됩니다.
  2. public String[] getTags() 메소드가 문자열의 배열을 리턴하는 경우, 문자열이 목록에 표시됩니다. 특성 보기의 기존 값에 사용된 레이블은 사용할 String을 결정하기 위해 특성 값을 가지는 public void setValue(Object)를 호출한 다음, public String getAsText()를 호출한 결과입니다. 목록에서 새 값을 선택하면 편집기의 메소드 public void setAsText(String)가 호출되고 public Object getValue()를 사용하여 새 특성 값이 검색됩니다.
  3. 위의 두 메소드가 모두 사용자 정의 편집기나 태그를 리턴하지 않으면 특성 시트에 텍스트 필드 편집기가 작성됩니다. 처음에 표시된 텍스트 값은 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()도 구체화되어야 합니다. 이로써 Java 소스 코드에서 특성 설명자의 set 메소드 인수로서 사용된 문자열이 리턴됩니다. 이 문자열은 값을 리턴해야 하고, 문자열에서 참조한 유형은 완전히 규정되어야 하지만 작성 중인 클래스에서 import 문과는 무관합니다. BeanInfo가 템플리트 JRE 클래스 java.beans.SimpleBeanInfo를 지정하면 메소드가 추상이 아니며 계승되어 '???'로 리턴됩니다. 클래스를 올바르게 구체화해야 합니다.

특성 설명자에 public String[] getTags() 메소드를 사용하여 목록을 가져오는 방법보다 간단하게 값 목록을 지정할 수 있는 방법이 있습니다. 속성 값은 enumerationValues 키를 비롯하여 목록에서 displayName의 항목이 3중으로 배열된 값, int에 입력되고 값 0,1,2 3을 가질 수 있는 direction이라는 특성을 예로 들어보십시오. 이러한 특성은 myclasses.CompassPoint 클래스에서 정적 필드 NORTH, EAST, SOUTH 및 WEST를 참조합니다. 특성 설명자는 다음과 같이 작성될 수 있습니다.

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

각 항목에서 두 번째 값은 myclasses.CompoassPoint.NORTH와 같은 int 정적 필드가 아니지만, 대신 java.lang.Integer의 인스턴스입니다. 이것은 Object에 입력된 배열에 원시 유형을 삽입할 수 없으므로, 대신 그에 상당하는 java.lang equivalent을 사용해야 하기 때문입니다.

Bean Info 이벤트

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.