## Reglas generales para el uso de Controladores de Distribución

A menos que se le diga a un contenedor que no utilice un controlador de disposición, el está asociado con su propio ejemplar de un controlador de disposición. Este controlador es consultado automáticamente cada vez que el contenedor necesita cambiar su apariencia. La mayoría de los controladores de disposición no necesitan que los programan llamen directamente a sus métodos.

#### Cómo elegir un Controlador de Distribución

> Los controladores de disposición proporcionados por la plataforma Java tienen diferentes potencias y puntos débiles. Esta sección descubre algunos de los escenarios de distribución más comunes y cómo podrían trabajar los controladores de distribución del AWT en cada escenario. Si ninguno de los controladores del AWT se adapta a nuestra situación, deberiamos; sentirnos libres para utilizar controladores de distribución distribuidos por la red, o escribir el nuestro propio.
> Escenario:Necesitamos mostrar un componente en todo el espacio que se pueda conseguir.
>   Consideramos la utilización de BorderLayout o GridBagLayout. Si utilizamos BorderLayout, necesitarremos poner el componente que necesite más espacio en el centro. Con GridBagLayout, necesitaremos seleccionar las restricciones del componente para que fill=GridBagConstraints.BOTH. Otra posibilidad es usar BoxLayout, haciendo que el componente con más tamaño especifique unos tamaño preferido y máximo muy grandes

> Escenario: Necesitamos mostrar unos pocos componentes en una fila compacta a su tamaño natural.
>   Consideramos usar un JPanel para contener los componentes y usar el controlador por defecto de JPanel que es FlowLayout o usar BoxLayout.

> Escenario: Necesitamos mostrar unos pocos componentes del mismo tamaño en filas y columnas.
>   GridLayout es perfecto para esto.

> Escenario: Necesitamos mostrar unos pocos componentes en filas y columnas, posiblemente variando la cantidad de espacio entre ellos, con alineamientos personalizados, o tamaños de componentes personalizados.
>   BoxLayout es perfecto para esto

> Escenario: Tenemos una distribución compleja con muchos componentes
>   Debemos considerar la utilización de GridBagLayout o agrupar los componetes en uno o más JPanel para simplificar la distribución. Cada JPanel dabería usar un diferente controlador de distribución.

#### Cómo crear un Controlador de Distribución y asociarlo con un Contenedor

> Como se mencionó en Control de Distribución, por convención, cada contenedor tiene su controlador de distribución. Todos los objetos JPanel se inicializan para usar un FlowLayout. El panel de contenidos para todos los objetos JApplet, JDialog, y JFrame está inicializado para usar un BorderLayout. Otros contendores Swing tienden a tener controladores de distribución muy especializados o, como en el caso de JLayeredPane, no tienen controlador de distribución.

> Si queremos utilizar el controlador de distribución por defecto de un Contenedor, no tenemos que hacer nada. El constructor de cada Contenedor crea un ejemplar del controlador de distribución e inicializa el Contenedor para que lo utilice.

> Para utilizar un controlador de disposición que no sea por defecto, necesitaremos crear un ejemplar de la clase del controlador deseado y luego decirle al contenedor que lo utilice. Normalmente sólo haremos esto para JPanel y para paneles de contenido. La siguiente sentencia crea un controlador BorderLayout y lo inicializa como controlador de distribución para un panel

>     aJPanel.setLayout(new BorderLayout());

Aquí podemos ver un ejemplo de hacer que un objeto FlowLayout sea el controlador de distribución para el panel de contenido de un applet:

    //In a JApplet subclass:
    Container contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());

#### Reglas del pulgar para usar Controladores de Distribución

> Los métodos de Container que dan como resultado llamadas a su controlador de distribución son add, remove, removeAll, doLayout, invalidate, getAlignmentX, getAlignmentY, getPreferredSize, getMinimumSize, y getMaximumSize. Los métoso add, remove, y removeAll añaden y eliminan componentes de un contenedor; se les puede llamar en cualquier momento. El método doLayout, que es llamado como resultado de cualquier petición de dibujado de un contenedor o de una llamada a validate sobre el contenedor, requiere que el contenedor se situe y redimensione a sí mosmo y a los componentes que contiene; no se puede llamar al método doLayout directamente.

> Si cambiamos el tamaño d eun componente, aunque sea indirectamente como cambiando su fuente, el componente debería redimensionarse automáticamente y redibujarse a sí mismo. Si esto no sucediera por alguna razón, deberíamos invocar al método revalidate del componente. Esta peticiónes pasada a través del árbol de contenientes hasta que encuentre un contenedor, como un scroll-pane o un contenedor de alto nivel, que no debería verse afecta por el redimensionado del componene. (Esto está determinado por la llamda al método isValidateRoot del contenedor.) El contenedor es entonces redistribuido, lo que tiene el efecto de ajustar los componentes revalidados y todos los demás componentes afectados. Después de llamar a revalidate sobre un componene se debería llamar a repaint.

> Los métodos getAlignmentX y getAlignmentY son llamados por los controladores de distribución para intenrar alinear grupos de componentes. BoxLayout es el único controlador de distribución que llama a estos métodos.

> Los métodos getPreferredSize, getMinimumSize, y getMaximumSize retornan los tamaños ideal, mínimo y máximo, respectivamente. Los valores devueltos son sólo indicativos, un controlador de distribución puede ignorarlos.

Ozito