## Cómo Utilizar la Clase ColorChooser

Se puede utilizar la clase JColorChooser para proporcionar a los usuarios una paleta para elegir colores. Un selector de color es un componente que se puede situar en cualquier lugar dentro del GUI de un programa. El API de JColorChooser también hace sencillo desplegar un diálogo (modal o no) que contiene un selector de color.

Aquí tienes una imagen de una aplicación que utiliza un selector de color para seleccionar el color de fondo de un banner:

El código fuente principal del programa está en ColorChooserDemo.java. También necesitarás Banner.java.

El selector de color consiste en cualquier cosa que hay dentro del borde llamado Choose Background Color. Contiene dos partes, un panel con pestañas y un panel de previsionado. Las tres pestañas delprimero seleccionan un panel selector diferente. El preview panel mustra el color seleccionado actualmente.

Aquí podemos ver el código del ejemplo que crea un ejemplar de JColorChooser y lo añade a la ventana:

    Banner banner = new Banner();
    ...
    final JColorChooser colorChooser = new JColorChooser(banner.getColor());
    ...
    getContentPane().add(colorChooser, BorderLayout.CENTER);

El constructor utilizado para crear el selector de color toma un argumento Color, que especifica el color seleccionaod inicialmente.

Un selector de color utiliza un ejemplar de ColorSelectionModel para contener y manejar la selección actual. Este dispara un evento "change" si el usuario cambia el color del selector. El programa de ejemplo registra un oyente de "change" con el ColorSelectionModel para poder actualizar el banner de la parte superior de la ventana.

Aquí podemos ver el código que registra e implementa el oyente de "change":

    colorChooser.getSelectionModel().addChangeListener(
        new ChangeListener() {
    	public void stateChanged(ChangeEvent e) {
    	    Color newColor = colorChooser.getColor();
    	    banner.setColor(newColor);
    	}
        }
    );

El oyente de Change obtiene el color seleccionado actualmente desde el selector de color y lo utiliza para seleccionar el color de fondo del banner. Puedes ver Cómo escribir un oyente de Change para información general sobre los evento de "Change" y sus oyentes.

Un selector de color básico , como el utilizado en el programa de ejemplo, es suficiente para muchos programas. Sin embargo, el API ColorChooser permite personalizar un selector de oclor proporcionando un panel de previsionado de nuestro propio diseño, añadiéndolo nuestros propios paneles, o eliminando los panles del selección existentes en el selector de color. Además, la clase ColorChooser proporciona dos métodos que hacen muy sencillo el uso de un selector de color dentro de un diálogo.

Esta sección explica estos tópicos:

- ColorChooserDemo: Toma 2
- Mostrar un ColorChooser en un diálogo
- Reemplazar o Eliminar el panel de Previsionado
- Crear un Panel Selector Personalizado
- El API ColorChooser
- Ejemplo que utilizando Selectores de Color

#### ColorChooserDemo: Toma 2

> Ahora veremos ColorChooserDemo2, una versión modificada del programa anterior que utiliza más API JColorChooser.

> Aquí puedes ver una imagen de ColorChooserDemo2:

> Además del fichero fuente principal, ColorChooserDemo2.java, necesitaremos CrayonPanel.java, Banner.java, y las cuatro imágenes de los lápizes (red.gif, yellow.gif, green.gif, y blue.gif) para ejecutar este programa.

> Este programa añade un GUI para cambiar el texto del banner y para seleccionar el color del texto. Podemos llamar al selector de color para el texto pulsando sobre el botón Choose Text Color..., que trae un diálogo selector de oclor.

> Además, este programa personaliza el selector del color de fondo del banner de estas formas:

> - Elimina el panel de previsionado
> - Elimina todos los paneles selectores por defecto
> - Añade un panel selector personalizado

#### Mostrar un Selector de Color en un Diálogo

> La clase JColorChooser proporciona dos métodos de clase que hace sencillo el uso de un selector de color en un dialog modal. El nuevo programa utiliza uno de estos métodos, showDialog, para mostar el selector de color del texto cuando el usuario pulsa el botón Choose Text Color.... Aquí puedes ver la línea de código del ejemplo que trae el diálogo modal del selector de color del texto:

>     Color newColor = JColorChooser.showDialog(ColorChooserDemo.this,
>     					  "Choose Text Color",
>                                               banner.getTextColor());

> El diálogo desaparece bajo tres condiciones: el usuario elige un color y pulsa el botón OK, el usuario cancela la operación con el botón Cancel, el usuario cierra el diálogo. Si el usuario elige un color, el metodo showDialog devuelve el nuevo color. Si el usuario cancela la operación o cierra el diálogo, el método devuelve null. Aquí podemos ver el código del ejemplo que actualiza el color del texto de acuerdo al valor devuelto por showDialog:

>     if (newColor != null) {
>         banner.setTextColor(newColor);
>     }

> JColorChooser proporciona otro método que nos ayuda a utiliza un selector de color en un diálogo. El método createDialog crea y devuelve un diálogo, permitiendo especificar los oyentes de action para los botones OK y Cancel de la ventana de diálogo. Se utiliza el método show de JDialog para mostrar el diálogo creado con este método.

#### Reemplazar o Eliminar el Panel de Previsionado

> > Nota: Las versiones Swing 1.1 Beta 2 y anteriores contienen un bug por el que el método setPreviewPanel lanza una NullPointerException. Por eso no hemos podido probar y verificar esta sección.

> Por defecto, el selector de color muestra un panel de previsionado.

> El programa de ejemplo elimina este panel con esta línea de código:

>     colorChooser.setPreviewPanel(new JPanel());

> Efectivamente, esto elimina el panel de previsionado porque un JPanel plano no tiene tamaño ni vista por defecto.

> Para proporcionar un panel de previsionado personalizado, también podemos utilizar setPreviewPanel. El componente que pasemos dentro del método debería descender de JComponent, especificar un tamaño razonable, y proporcionar una vista personalizada del color actual (obtenida con el método getColor de Component getColor). De hecho, después de añadir un método getPreferredSize a Banner, podríamos utilizar un ejemplar de Banner como panel de previsionado.

#### Crear un Panel Selector Personalizado

> El selector de color por defecto proporciona tres paneles selectores:
> - Swatches -- para elegir un color de una selección.
> - HSB -- para elegir un color usando el modelo Color-Saturación-Brillo.
> - RGB -- para elegir un color usando el modelo Rojo-Verde-Azul.
> Se pueden extender los selectores por defecto añadiendo paneles selectores de nuestro propio diseño o podemos limitarlo eliminando paneles selectores. ColorChooserDemo2 hace las dos cosas: elimina todos los paneles por defecto en el selector de color y añade el suyo propio.

> Aquí podemos ver el código que elimina los paneles selectores por defecto:

>     //Remove the default chooser panels
>     AbstractColorChooserPanel panels[] = colorChooser.getChooserPanels();
>     for (int i = 0; i < panels.length; i ++) {
>         colorChooser.removeChooserPanel(panels[i]);
>     }

> El código es correcto, utiliza getChooserPanels para obtener un array conteniendo todos los paneles selectores en el selector de color. Luego, el código hace un bucle a través del array y elimina cada uno de ellos llamando a removeChooserPanel.

> El programa utiliza el siguiente código para añadir un ejemplar de CrayonPanel como un panel selector del selector de color:

>     colorChooser.addChooserPanel(new CrayonPanel());

> > Nota: Las versiones Swing 1.1 Beta 2 y anteriores contienen un bug que hace que el método addChooserPanel genera una NullPointerException. Puedes ver el código de See ColorChooserDemo2.java para un atajo recomendado.

> CrayonPanel es una subclase de AbstractColorChooserPanel y sobreescribe los cinco métodos abstractos definidos en su superclase:
> void updateChooser()
>   Este método es llamado cuando el se muestra el panel selector. La implementación de este método en el ejemplo selecciona el botón que representa el color seleccionado actualmente.

>       public void updateChooser() {
>           Color color = getColorFromModel();
>           if (color.equals(Color.red)) {
>               redCrayon.setSelected(true);
>           } else if (color.equals(Color.yellow)) {
>               yellowCrayon.setSelected(true);
>           } else if (color.equals(Color.green)) {
>               greenCrayon.setSelected(true);
>           } else if (color.equals(Color.blue)) {
>               blueCrayon.setSelected(true);
>           }
>       }

> void buildChooser()
>   Crea el GUI que comprende el panel selector. El ejemplo crea cuatro botones -- uno para cada lápiz -- y los añade al panel selector.

> String getDisplayName()
>   Devuelve el nombre mostrado por el panel selector. El nombre es utilizado para la pestaña del panel selector. Aquí tenemos el método getDisplayName del ejemplo: method:

>       public String getDisplayName() {
>           return "Crayons";
>       }

> Icon getSmallDisplayIcon()
>   Devuelve un pequeño icono que representa este panel selector. El icono es utilizad por la pestaña del panel selector. La implemtación de este método devuelve null.

> Icon getLargeDisplayIcon()
>   Devuelve un icono que representa este panel selector. El icono es utilizad por la pestaña del panel selector. La implemtación de este método devuelve null. Además de estos métodos sobreescritos, CrayonPanel tiene un constructor que sólo llama a super().

#### El API ColorChooser

> Las siguientes tablas listas el métodos y constructores más utilizados de JColorChooser.

> El API para utilizar selectores de colores se divide en estas categorías:

> - Crear y Mostrar un ColorChooser
> - Personalizar un ColorChooser
> - Seleccionar u Obtener la Selección Actual

> Crear y Mostrar un ColorChooser
> Método | Propósito
> --- | ---
> JColorChooser() JColorChooser(Color) JColorChooser(ColorSelectionModel) | Crea un selector de color. El constructor por defecto crea un selector de color con el color inicial blanco. Se utiliza el segundo constructor para especificar un color inicial diferente. El argumento, ColorSelectionModel, cuando está presente, proporciona un selector de color con un modelo de selección de color.
> Color showDialog(Component, String, Color) | Crea y muestra un selector de color en un diálogo modal. El argumento Component es el padre del diálogo, el argumento String específica el título del diálogo, y el argumento Color el color seleccionado inicialmente.
> JDialog createDialog(Component, String, boolean, JColorChooser, ActionListener, ActionListener) | Crea un diálogo para el selector de color especificado. Como en showDialog, el argumento Component es el padre del diálogo y el argumento String específica el título del diálogo. El argumento boolean especifica si el diálogo es modal. El primer ActionListener es para el botón OK, y el segundo para el botón Cancel.

> Personalizar un ColorChooser
> Método | Propósito
> --- | ---
> void setPreviewPanel(JComponent) JComponent getPreviewPanel() | Selecciona u obtiene el componente utilizado para previsionar la selección de color. Para eleminar el panel de previsionado, se utiliza new JPanel(). Para especificar el panel de previsionado por defecto, se utiliza null.
> void setChooserPanels(AbstractColorChooserPanel[]) AbstractColorChooserPanel[] getChooserPanels() | Selecciona u obtiene los paneles selectores en el selector de color.
> void addChooserPanel(AbstractColorChooserPanel) AbstractColorChooserPanel removeChooserPanel(AbstractColorChooserPanel) | Añade o elimina un panel selector en el selector de color.

> Seleccionar u Obtener la Selección Actual
> Método | Propósito
> --- | ---
> void setColor(Color) void setColor(int, int, int) void setColor(int) Color getColor() | Selecciona u obtiene el color seleccionado actualmente. Los tres argumentos enteros de setColor especifican los valores RGB del color. El único argumento entero de setColor también específica el color en RGB. Los 8 bits de mayor peso especifican el rojo, los 8 bits siguientes el verde, y los 8 bits de menor peso el azul.
> void setSelectionModel(ColorSelectionModel) ColorSelectionModel getSelectionModel() | Selecciona u obtiene el modelo de selección para el selector de color. Este objeto contiene la selección actual y dispara eventos change para los oyentes registrados si la selección cambia.

#### Ejemplos que Utilizan ColorChooser

> Esta tabla muestra los ejemplos que utilizan JColorChooser y dónde se describen estos ejemplos.

> Ejemplo | Dónde se Describe | Notas
> --- | --- | ---
> ColorChooserDemo.java | Esta página | Utiliza un selector de color básico.
> ColorChooserDemo2.java | Esta página | Utiliza un selector de color personalizado y crea uno con showDialog.

Ozito