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