## Cómo Usar la Clase ComboBox

Con un JComboBox editable, una lista desplegable, y un text field, el usuario puede teclear un valor o elegirlo desde una lista. Un ComboBox editable ahorra tiempo de entrada proporcionando atajos para los valores más comunmente introducidos.

Un ComboBox no editable desactiva el tecleo pero aún así permite al usuario seleccionar un valor desde una lista. Esto proporciona un espacio altenartivo a un grupo de radio buttons o una list.

Aquí puedes ver una imagen de una aplicación que utiliza un ComboBox editable para introducir un patrón con el que formatear fechas.

| Intenta esto: Compila y ejecuta el ejemplo: ComboBoxDemo.java. Introduce un nuevo patrón eligiendo uno de la lista desplegable. El programa reformatea la fecha y hora actuales. Introduce un nuevo patrón tecleándolo y pulsando return. De nuevo el programa reformatea la fecha y hora actuales.

Abajo podemos ver el código de ComboBoxDemo.java que crea y configura el ComboBox:

    String[] patternExamples = {
    	 "dd MMMMM yyyy",
    	 "dd.MM.yy",
    	 "MM/dd/yy",
    	 "yyyy.MM.dd G 'at' hh:mm:ss z",
    	 "EEE, MMM d, ''yy",
    	 "h:mm a",
    	 "H:mm:ss:SSS",
    	 "K:mm a,z",
    	 "yyyy.MMMMM.dd GGG hh:mm aaa"
    };

    currentPattern = patternExamples[0];
    . . .
    JComboBox patternList = new JComboBox(patternExamples);
    patternList.setEditable(true);
    patternList.setSelectedIndex(0);
    patternList.setAlignmentX(Component.LEFT_ALIGNMENT);
    PatternListener patternListener = new PatternListener();
    patternList.addActionListener(patternListener);

Este programa proporciona los valores para la lista desplegable del ComboBox con un array de strings. Sin embargo, los valores de la lista pueden ser cualquier Object, en cuyo caso el método toString de la clase Object proporciona el texto a mostrar. Para poner una imagen u otro valor que no sea texto en una lista ComboBox, sólo debemos proporcionar un celda personalizada renderizada con setRenderer.

Observa que el código activa explícitamente la edición para que el usuario pueda teclear valores. Esto es necesario porque, por defecto, un ComboBox no es editable. Este ejemplo particular permite editar el ComboBox porque su lista no proporciona todos los patrones de formateo de fechas posibles.

El código también registra un oyente de action con el ComboBox. Cuando un usuario selecciona un ítem del ComboBox, se llama a este método:

    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox)e.getSource();
        String newSelection = (String)cb.getSelectedItem();
        currentPattern = newSelection;
        reformat();
    }

El método llama a getSelectedItem para obtener el nuevo patrón elegido por el usuario, y utilizarlo para reformatear la fecha y la hora actuales.

> Cuidado: Un ComboBox es un componente compuesto: comprende un botón, un menú desplegable, y cuando es editable, un campo de texto. El ComboBox dispara eventos de alto nivel, como eventos action. Sus componentes disparan eventos de bajo nivel como mouse, key y eventos de foco. Normalmente los componentes compuestos como el ComboBox deberían proporcionar oyentes para los eventos de alto nivel, porque los eventos de bajo nivel y los subcomponentes que los disparan son dependientes del sistema.

#### Utilizar un ComboBox no Editable

> Aquí podemos ver una imagen de una aplicación que utiliza un ComboBox no editable para permitir al usuario elegir una imagen de mascota desde una lista:

> | Intenta esto: Compila y ejecuta el programa: ComboBoxDemo2.java. También necesitarás 5 ficheros de imágenes: Bird.gif, Cat.gif, Dog.gif, Rabbit.gif, and Pig.gif. Eleige una mascota desde la lista desplegable para ver su dibujo. Cómo usar Radio Buttons proporciona una versión de este programa, RadioButtonDemo.java, que utiliza un grupo de botones de rádio en lugar de un ComboBox. Compila y ejecuta el programa. Compara el código fuente y la operación de los dos programas.

> Abajo podemos ver el código de ComboBoxDemo2.java que crea y configura el ComboBox:

>     ...
>     //in the ComboBoxDemo2 constructor
>     String[] petStrings = { "Bird",
>                             "Cat",
>                             "Dog",
>                             "Rabbit",
>                             "Pig" };

>     // Crea el combobox,
>     // desactiva la edición
>     // y selecciona el primero
>     JComboBox petList = new JComboBox(petStrings);
>     petList.setSelectedIndex(0);

> Este código es similar al código de ComboBoxDemo. Sin embargo, este programa deja el ComboBox no editable (por defecto).

> Se utiliza un ComboBox no editable en lugar de un grupo de botones de radio para mostrar una o más elecciones en estas situaciones:

> - Cuando el espacio es limitado
> - Cuando el número de elecciones posibles es grande
> - Cuando la lista se crea durante la ejecución

#### El API ComboBox

> Las siguientes tablas listan los métodos y constructores más utilizados de JComboBox. Otros métodos a los que nos gustaría llamar están definidos por las clases JComponent y Component.

> El API para utilizar ComboBox se divide en dos categorías:

> - Seleccionar u Obtener Ítems de la Lista del ComboBox
> - Personalizar la Operación del ComboBox

> Seleccionar u Obtener Ítems de la Lista del ComboBox
> Método | Propósito
> --- | ---
> JComboBox(ComboBoxModel) JComboBox(Object[]) JComboBox(Vector) | Crea un ComboBox con una lista predeterminada.
> void addItem(Object) void insertItemAt(Object, int) | Añade o inserta un ítem en la lista.
> Object getItemAt(int) Object getSelectedItem() | Obtiene un ítem de la lista.
> void removeAllItems() void removeItemAt(int) void removeItem(Object) | Elimina uno o más ítems de la lista.
> int getItemCount() | Obtiene el número de ítems de la lista.
> void setModel(ComboBoxModel) ComboBoxModel getModel() | Selecciona u obtiene el modelo de datos que proporciona los ítems de la lista.

> Personalizar la Configuración del ComboBox
> Método | Propósito
> --- | ---
> void setEditabe(boolean) boolean isEditable() | Selecciona u Obtiene si el usuario puede teclear en el ComboBox.
> void setRenderer(ListCellRenderer) ListCellRenderer getRenderer() | Selecciona u obtiene el objeto responsable para crear el ítem seleccionado en el ComboBox. Utilizado cuando el ComboBox no es editable.
> void setEditor(ComboBoxEditor) ComboBoxEditor getEditor() | Selecciona u obtiene el objeto responsable del pintado y edición del ítem seleccionado en el ComboBox. Esto sólo se utiliza cuando el ComboBox es editable.

#### Ejemplos que utilizando JComboBox

> Esta tabla muestra ejemplos que utilizan JComboBox y dónde se pueden encontrar.

> Ejemplos | Dónde se describe | Notas
> --- | --- | ---
> ComboBoxDemo.java | Esta página. | Un ComboBox editable.
> ComboBoxDemo2.java | Esta página. | Un ComboBox no editable.
> LayeredPaneDemo.java | Cómo usar Layered Panes | Un ComboBox no editable.
> TableRenderDemo.java | Cómo usar Tablas | Muestra como utilizar un ComboBox como un editor de celdas de una tabla.

Ozito