## Cómo usar Bordes

Cada JComponent puede tener uno o más bordes. Los bordes son objeto increiblemente útiles que, sin ser componentes, saben como dibujar los lados de los componentes Swing. Los bordes son útiles no sólo para dibujar líneas y laterales divertidos, también para proporcionar títulos y espacio vacío alrededor de los componentes.

Para poner un borde alrededor de un JComponent, se usa su método setBorder. Podemos usar la clase BorderFactory para crear la mayoría de los bordes que proporciona Swing. Aquí hay un ejemplo de código que crea un contenedor con bordes:

    JPanel pane = new JPanel();
    pane.setBorder(BorderFactory.createLineBorder(Color.black));

Aquí podemos ver una imagen del contenedor, que contiene un componente label, la línea negra dibujada por el borde márca los límites del contenedor.

El resto de está página explica los siguientes tópicos:

- El ejemplo BorderDemo
- Usar los Bordes Proporcionados por Swing
- Añadir un Borde a un Componente Swing con bordes
- Crear Bordes Personalizados
- El API de Border
- Ejemplos que usan Borders

#### El ejemplo BorderDemo

> Las siguientes figuras muestran una aplicación llamada BorderDemo que muestra los bordes proporcionados por Swing. El código para crear estos bordes se explican en la siguiente sección. La primera figura muestra algunos bordes sencillos:

> La siguiente imagen muestra algunos bordes mate. Cuando se crea uno de estos bordes, se especifica cuántos pixels ocipa en la parte superior, la izquierda, la inferior y la derecha del componente. Luego se especifica un color o un icono para que se dibuje en el borde. Se debe tener cuidado cuando se elige el icono y determinar el tamaño de nuestro componente; de otra forma, el icono podría recortarse o no cuadrar en las esquinas del componente.

> La siguiente imagen mustra bordes con título. Usando un borde con título podemos convertir cualquier borde en uno que muestre un texto descriptivo. Si no especificamos un borde se utiliza el borde específico del aspecto y el comportamiento. Por ejemplo, el borde con título por defecto, en el aspecto y comportamiento Java usa una línea gris.

> La siguiente figura muestra bordes compuestos. Con estos bordes, podemos combinar dos bordes cualquiera que a su vez pueden ser bordes compuestos.

#### Usar los Bordes Proporcionados por Swing

> El siguiente código muestra cómo crear y seleccionar los bordes que hemos visto en las imágenes anteriores. Puedes encontrar el código del programa en BorderDemo.java.

>     //Keep references to the next few borders, for use in titles
>     //and compound borders.
>     Border blackline, etched, raisedbevel, loweredbevel, empty;

>     blackline = BorderFactory.createLineBorder(Color.black);
>     etched = BorderFactory.createEtchedBorder();
>     raisedbevel = BorderFactory.createRaisedBevelBorder();
>     loweredbevel = BorderFactory.createLoweredBevelBorder();
>     empty = BorderFactory.createEmptyBorder();

>     //Simple borders
>     jComp2.setBorder(blackline);
>     jComp3.setBorder(raisedbevel);
>     jComp4.setBorder(loweredbevel);
>     jComp5.setBorder(empty);

>     //Matte borders
>     ImageIcon icon = new ImageIcon("images/left.gif"); //20x22
>     jComp6.setBorder(BorderFactory.createMatteBorder(-1, -1, -1, -1, icon));
>     jComp7.setBorder(BorderFactory.createMatteBorder(1, 5, 1, 1, Color.red));
>     jComp8.setBorder(BorderFactory.createMatteBorder(0, 20, 0, 0, icon));

>     //Titled borders
>     TitledBorder title1, title2, title3, title4, title5;
>     title1 = BorderFactory.createTitledBorder("title");
>     jComp9.setBorder(title1);

>     title2 = BorderFactory.createTitledBorder(
>     		       blackline, "title");
>     title2.setTitleJustification(TitledBorder.CENTER);
>     jComp10.setBorder(title2);

>     title3 = BorderFactory.createTitledBorder(
>     		       etched, "title");
>     title3.setTitleJustification(TitledBorder.LEFT);
>     jComp11.setBorder(title3);

>     title4 = BorderFactory.createTitledBorder(
>     		       loweredbevel, "title");
>     title4.setTitlePosition(TitledBorder.ABOVE_TOP);
>     jComp12.setBorder(title4);

>     title5 = BorderFactory.createTitledBorder(
>     		       empty, "title");
>     title5.setTitlePosition(TitledBorder.BOTTOM);
>     jComp13.setBorder(title5);

>     //Compound borders
>     Border compound1, compound2, compound3;
>     Border redline = BorderFactory.createLineBorder(Color.red);

>     //This creates a nice frame.
>     compound1 = BorderFactory.createCompoundBorder(
>     			  raisedbevel, loweredbevel);
>     jComp14.setBorder(compound1);

>     //Add a red outline to the frame.
>     compound2 = BorderFactory.createCompoundBorder(
>     			  redline, compound1);
>     jComp15.setBorder(compound2);

>     //Add a title to the red-outlined frame.
>     compound3 = BorderFactory.createTitledBorder(
>     			  compound2, "title",
>     			  TitledBorder.CENTER,
>     			  TitledBorder.BELOW_BOTTOM);
>     jComp16.setBorder(compound3);

> Cómo habrás observado, el código usa la clase BorderFactory para crear cada bord. Esta clase, que está en el paquete javax.swing, devuelve un objeto que implementa el interface Border.

> El interface Border, así como sus implementaciones proporcionadas por Swing, están en el paquete javax.swing.border. Normalmente no necesitaremos usar directamente nada del paquete border, excepto cuando especifiquemos constantes que sean específicas de un clase particular o cuando nos refiramos al tipo Border.

#### Crear Brodes Personalizados

> Si la clase BorderFactory no nos ofrece suficiente control sobe la forma de nuestro borde, podríamos usar directamente el API del paquete border -- o incluso definir nuestro propio borde. Además de contener el interface Border, el paquete border contiene las clases que implementan los bordes que ya hemos visto:LineBorder, EtchedBorder, BevelBorder, EmptyBorder, MatteBorder, TitledBorder, y CompoundBorder. El paquete border también contiene una clase llamada SoftBevelBorder, que produce un resultado similar a BevelBorder.

> Si ninguno de los bordes Swing nos sirve, podemos implementar nuestro propio borde. Generalmente, hacemos esto creando una subclase de AbstractBorder. En nuestra subclase, debemos implementar al menos un constructor y los siguientes dos métodos:

> - paintBorder, que contiene el código de dibujo que un JComponent ejecuta para dibujar el borde.
> - getBorderInsets, que especifica la cantidad de espacio que el borde necesita para dibujarse a sí mismo.
> Además, si nuestro borde es opaco, podemos disminuir el tiempo de dibujo sobreescribiendo el método setOpaque para que devuelva true. Para ejemplos de implementación de bordes, puedes ver el código fuente de las clases del paquete javax.swing.border.

#### Añadir Bordes a un Componente Swing con Bordes

> Muchos de los componentes listos-para-usar de Swing usan bordes para dibujar las líneas exteriores del componente, Si queremos dibujar un borde adicional alrededor del borde existente -- para proporcionar algún espacio extra sobre una barra de progreso, por ejemplo -- necesitamos añadir el nuevo borde al ya existente. Aquí tenemos un ejemplo de cómo hacerlo:

>     aJComponent.setBorder(
>         BorderFactory.createCompoundBorder(
>                         BorderFactory.createEmptyBorder(20,0,0,0),
>                         aJComponent.getBorder())
>     );

> El nuevo borde, devuelto por createEmptyBorder, añade 20 pixels de espacio vacío sobre cualquier componente que lo use. Para combinar el nuevo borde con el ya existente (que es devuelto por getBorder), el código usa el método createCompoundBorder.

#### El API de Border

> Las siguientes tablas listan los métodos más usados de border. El API para usar bordes se divide en dos categorías:
> - Crear un Borde con BorderFactory
> - Seleccionar u Obtener el Borde de un Componente

> Crear un Brode con BorderFactory
> Método | Propósito
> --- | ---
> Border createLineBorder(Color) Border createLineBorder(Color, int) | Crea un borde de línea. El primer argumento es un objeto java.awt.Color que especifica el color de la línea. El segundo argumento opcional especifica la anchura en pixels de la línea.
> Border createEtchedBorder() Border createEtchedBorder(Color, Color) | Crea un borde sombreado. Los argumentos opcionanles especifican los colores usados en la iluminación y la sombra.
> Border createLoweredBevelBorder() | Crea un borde que ofrece la ilusión de que un componente está por debajo del área que le rodea.
> Border createRaisedBevelBorder() | Crea un borde que ofrece la ilusión de que un componente está por encima del área que le rodea.
> Border createBevelBorder(int, Color, Color) Border createBevelBorder(int, Color, Color, Color, Color) | Crea un borde elevado o bajado, especificando los colores a utilizar. El argumento entero puede ser RAISED o LOWERED (constantes definidas en BevelBorder). Con el constructor de tres argumentos, podemos especificar los colores sde iluminación y de sombra. Con el argumentos de cuatro argumentos podemos especificar los colores de iluminación exterior, iluminación interior, sombra exterior y sombra interior, por este orden.
> Border createEmptyBorder() Border createEmptyBorder(int, int, int, int) | Crea un borde invisible. Si no especificamos argumentos el borde no ocupa ningún espacio, que es útil creamos un borde con título sin límites visibles. Los argumentos opcionales especifican el número de pixels que ocupara el borde en la parte superior, izquierda, inferior y derecha (en este orden) en cualquier componente que lo utilice.
> MatteBorder createMatteBorder(int, int, int, int, Color) MatteBorder createMatteBorder(int, int, int, int, Icon) | Crea un borde relleno. Los argumentos enteros especifican el número de pixels que ocupa el borde en la parte superior, izquierda, inferior y derecha (en este orden) en cualquier componente que lo utilice. El argumento Color especifica el color con el que deberá rellenarse el área. El argumento Icon especifica el icono con el que el borde debería rellener su área.
> TitledBorder createTitledBorder(String) TitledBorder createTitledBorder(Border) TitledBorder createTitledBorder(Border, String) TitledBorder createTitledBorder(Border, String, int, int) TitledBorder createTitledBorder(Border, String, int, int, Font) TitledBorder createTitledBorder(Border, String, int, int, Font, Color) | Crea un borde con titulo. El argumento String especifica el título a mostrar. Los argumentos Font y Color opcionales especifican la fuente y el color a utilizar en el texto del título. El argumento Border especifica el borde que debería mostrarse junto con el título. Si no se especifica ningún borde, se utiliza el borde por defecto del aspecto y comportamiento. Por defecto, el título aparece en la parte superior de su borde y justificado a la izquierda. Los argumentos enteros adicionales especifican la posición y justificación del título, en este orden. TitledBorder define estas pisibles situaciones: ABOVE_TOP, TOP (por defecto), BELOW_TOP, ABOVE_BOTTOM, BOTTOM, BELOW_BOTTOM. Podemos especificar la justificación como LEFT (por defecto), CENTER, o LEFT.
> CompoundBorder createCompoundBorder(Border, Border) | Combina dos bordes en uno. El primer argumento especifica el borde exterior y el segundo el interior.

> Seleccionar u Obtener el Borde de un Componente
> Método | Propósito
> --- | ---
> void setBorder(Border) Border getBorder() | Selecciona u obtiene el borde del JComponent recibido.
> void setBorderPainted(boolean) boolean isBorderPainted() (en AbstractButton, JMenuBar, JPopupMenu, JProgressBar, y JToolBar) | Selecciona u obtiene si el borde del componente debería ser dibujado.

#### Ejemplos que usan Bordes

> Muchos ejemplos de esta lección usan bordes. La siguiente tabla lista uno cuantos casos interesantes.

> Ejemplo | Dónde se Describe | Notas
> --- | --- | ---
> BorderDemo.java | Esta página. | Muestra un ejemplo de cada uno de los tipos de bordes que puede crear BorderFactory. También usa un borde vacío para añadir expacio entre cada panel y sus contenidos.
> AlignmentDemo.java | Cómo usar BoxLayout | Uss bordes con título.
> BoxLayoutDemo.java | Cómo usar BoxLayout | Usa una línea roja para mostrar donde está el límite del contenedor, para que podamos ver como se distribuye el espacio extra usando BoxLayout.
> ComboBoxDemo.java | Cómo usar Combo Boxes | usa un borde compuesto para combinar un borde de línea y un borde vacío. El borde vacío proporciona espacio entre la línea y el interior del componente.

Ozito