## Propiedades Indexadas

Las propiedades indexadas reprensentan coleciones de valores a los que se accede por índices como en los arrays. Los patrones de diseño de las propiedades indexadas son

    //Métodos para acceder al array de propiedades completo
    public <PropertyType>[] get();
    public void set<PropertyName>([] value);

    //Métodos para acceder a valores individuales
    public <PropertyType> get(int index);
    public void set<PropertyName>(int index,  value);

De acuerdo con estos patrones las herramientas de programación saben que nuestro Bean contiene una propiedad indexada.

El Bean OurListBox ilustra como utilizar las propiedades indexadas. OurListBox desciende de la clase List para proporcionar un Bean que presenta al usuario una lista de elecciones: Choices que se puede proporcionar y diseñar durante el diseñó. Aquí tienes una ilustración de un ejemplar de OurListBox :

OurListBox expone el item indexado con los siguientes métodos accesores:

    public void setItems(String[] indexprop) {
      String[] oldValue=fieldIndexprop;
      fieldIndexprop=indexprop;
      populateListBox();
      support.firePropertyChange("items",oldValue, indexprop);
    }

    public void setItems(int index, String indexprop) {
      String[] oldValue=fieldIndexprop;
      fieldIndexprop[index]=indexprop;
      populateListBox();
      support.firePropertyChange("Items",oldValue, fieldIndexprop);
    }

    public String[] getItems() {
      return fieldIndexprop;
    }

    public String getItems(int index) {
      return getItems()[index];
    }

Cuando un item es seleccionado por uno de los métodos setItems(), OurListBox se puebla con el contenido de un array String.

La exposición de las propiedades indexadas es casi tan fácil como la de las propiedades sencillas. Sin embargo, escribir un editor de propiedades indexadas requiere escribir un editor de propiedades personalizado.

### Editores de Propiedades Indexadas

El Bean OurListBox proporciona un IndexPropertyEditor asociado que es un buen ejemplo de cómo implementar un editor de propiedades indexadas. La siguiente ilustración muestra un ejemplar de OurListBox en el BeanBox, la hoja de propiedades que contiene una entrada para los items de la propiedad indexada, y el IndexPropertyEditor que sale cuando se pulsa sobre los ítems de la propiedad:

Implementar IndexPropertyEditor es lo mismo que implementar cualquier editor de propiedades personalizado:

1. Implementar el interface PropertyEditor:

              public class IndexPropertyEditor extends Panel
                            implements PropertyEditor, Action Listener {

   Se puede utilizar la clase PropertyEditorSupport, utilizando una subclase o como clase interna.
2. Denotar el editor personalizado en una clase BeanInfo relacionada. OurListBox tiene una clase OurListBoxBeanInfo relacionada que contiene el siguiente código:

                itemsprop.setPropertyEditorClass(IndexPropertyEditor.class);

3. Hacer que el editor de propiedades sea una fuente de eventos compartidos. El editor de propiedades registrará los oyentes de la propiedad y disparará los eventos de cambio de propiedad a esos oyentes. Así es como los cambios en la propiedad se propagan hacia el Bean (mediante la hoja de propiedades). Por eso IndexPropertyEditor ejemplariza una clase interna PropertyChangeSupport:

                 private PropertyChangeSupport support =
                      new PropertyChangeSupport(this);

   Proporciona la habilidad de que los objetos registren su interés en ser notificados cuando una propiedad es editada:

              public void addPropertyChangeListener(PropertyChangeListener l) {
               support.addPropertyChangeListener(l);
              }

              public void removePropertyChangeListener(PropertyChangeListener l) {
               support.removePropertyChangeListener(l);
              }

   Y dispara un evento de cambio de propiedad a dichos oyentes:

                 public void actionPerformed(ActionEvent evt) {
               if (evt.getSource() == addButton) {
                   listBox.addItem(textBox.getText());
                   textBox.setText("");
                   support.firePropertyChange("", null, null);
               }
               else if (evt.getSource()== textBox) {
                   listBox.addItem(textBox.getText());
                   textBox.setText("");
                   support.firePropertyChange("",null,null);
               }
               ...
              }

IndexPropertyEditor mantiene listbox como una copia de OurListBox. Cuando se hace un cambio en listbox, se dispara un evento de cambio de propiedad a todos los oyentes.

Cuando una hoja de propiedades, que está registrada como un oyente de IndexPropertyEditor, recibe un evento de cambio de propiedad desde IndexPropertyEditor, llama a IndexPropertyEditor.getValue() para recuperar los ítems nuevos o cambiados para actualizar el Bean.

Ozito