Dicas para gravar classes BeanInfo para o editor visual

Esta seção descreve algumas regras que poderão ser empregadas se você estiver gravando uma classe BeanInfo para um bean Java destinado para uso no editor visual para Java.

O editor visual para Java utiliza os descritores de propriedade descritos na classe BeanInfo para estabelecer a lista de entradas na visualização de Propriedades e também como elas devem ser editadas.

Se um java.beans.PropertyDescriptor estiver oculto, ele não estará disponível dentro do visualizador de Propriedades. Porém, os métodos definidos de propriedades ocultas ainda serão analisados pelo gerador de códigos e serão aplicados aos beans ativos.

Quando uma propriedade está oculta, ela continua a ser utilizada pela análise de código, mas não será incluída em nenhuma outra visualização ou recurso do editor visual. O VisualAge para Java permitia que uma propriedade fosse excluída da visualização Propriedades, mas que continuasse disponível para outras funções. Por exemplo, o recurso de conexões teve seu atributo design-time definido como falso. Embora o editor visual para Java não tenha mais o recurso de conexão, o conceito de propriedades design-time é suportado. Para fazer com que uma propriedade não seja exibida durante o design time, um valor de atributo deve ser definido com a chave de ivjDesignTimeProperty e o valor de Boolean.FALSE. 

Por exemplo, se uma classe BeanInfo estiver sendo gravada para a classe MyJavaBean que tem uma propriedade de nome (de um par de métodos public void setName(String) e public String getName()), o método getPropertyDescriptors() poderia ser gravado como segue:

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

Quando uma propriedade é selecionada na visualização Propriedades, é criado um editor na coluna Valor que permite especificar um novo valor. Para calcular o editor para uma propriedade, o java.beans.PropertyDescriptor é consultado sobre um editor de propriedade. Se um editor de propriedade associado for localizado, ele será utilizado. Caso contrário, é localizado um editor que é definido para trabalhar com o tipo de propriedade. Não é possível afetar a lista de editores de propriedade predefinidos para um tipo. Se um java.beans.PropertyEditor for localizado no descritor de propriedade ou localizado para o tipo de propriedade, a visualização Propriedades tentará determinar o tipo de editor a ser criado. As regras utilizadas são:

  1. Se o método public boolean supportsCustomEdit() retornar verdadeiro, um editor de diálogo será criado. O botão do diálogo ativa o editor retornado do método public Component getCustomEditor(). O editor retornado deve ser uma subclasse de java.awt.Component e será hospedado com um botão OK e Cancelar em um Frame ou JFrame, conforme requerido.
  2. Se o método public String[] getTags() retornar uma matriz de cadeias, elas serão mostradas em uma lista. A etiqueta utilizada para um valor existente na visualização Propriedades é o resultado da chamada de public void setValue(Object) com o valor de propriedade e, em seguida, da chamada de public String getAsText() para determinar a Cadeia a ser utilizada. Conforme você seleciona um novo valor na lista, o método do editor public void setAsText(String) é chamado e o novo valor de propriedade é recuperado utilizando public Object getValue().
  3. Se nenhum dos dois métodos acima retornar um editor personalizado ou marcações, um editor de campo de texto será criado na folha de Propriedades. O valor de texto inicialmente exibido é o resultado da chamada de public void setValue(Object) e public String getAsText(). Quando uma nova cadeia é digitada no editor de texto em cada pressionamento de tecla, o método public void setAsText(String) é chamado. Se o método lançar uma java.lang.IllegalArgumentException, a mensagem de exceção será mostrada na barra de status e o valor não será aplicado. Se nenhuma exceção for lançada, quando a tecla Enter for clicada no editor de texto (ou se outra propriedade na visualização Propriedades receber foco), o resultado da chamada de public Object getValue() será enviado como o argumento ao método definido descrito no descritor de propriedades.

Para cada java.beans.PropertyEditor, o método public String getJavaInitializationString() deve também ser especializado. Isso retorna a cadeia que é utilizada no código fonte Java como o argumento para o método definido do descritor de propriedades. Essa cadeia deve retornar o valor e todos os tipos referidos na cadeia devem ser completos e não contar com nenhuma instrução de importação na classe que está sendo composta. Se o BeanInfo especializar a classe JRE do gabarito java.beans.SimpleBeanInfo, o método não será resumido e será herdado para retornar '???'. É necessário lembrar de especializá-lo corretamente.

Além de utilizar o método public String[] getTags() em um descritor de propriedades para obter uma lista, há uma maneira mais curta de especificar uma lista de valores. Um valor de atributo é criado com a chave de enumerationValues, um valor que é uma matriz de entradas triplicadas do displayName na lista, o valor em si e a initializationString. Como exemplo, considere uma propriedade chamada direction que é digitada para int e pode receber valores de 0, 1, 2 e 3. Estes são referências a campos estáticos NORTH, EAST, SOUTH e WEST na classe myclasses.CompassPoint. O descritor de propriedades pode ser gravado como segue:

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

O segundo valor em cada uma das entradas não é o campo estático int em si como myclasses.CompoassPoint.NORTH, mas, em vez disso, é uma instância de java.lang.Integer. Isso porque tipos primitivos não podem ser colocados em uma matriz que é digitada para Object, então, em vez disso, seu java.lang equivalent deve ser utilizado.

Eventos Bean Info

A lista de eventos que é mostrada em um bean Java são os descritores do método preferido em seus descritores de eventos.

Se uma classe do adaptador estiver disponível, ela deverá ser incluída no java.beans.EventDescriptor como um atributo denominado com uma chave de "eventAdapterClass", por exemplo

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

Tópico pai: Classes BeanInfo e Introspecção

Tarefas Relacionadas
Controlando Informações de BeanInfo para Desenvolvedores de Plug-in
Especificando a Localização das Classes BeanInfo

(C) Copyright IBM Corporation 1999, 2004. Todos os Direitos Reservados.