Diseños

Se han visto algunos ejemplos simples que muestran cómo colocar o asignar un tamaño a widgets hijos basados en el tamaño del padre. Hasta ahora, este tipo de cálculo se ha producido como respuesta a un escuchador de cambio de tamaño. Ésta suele ser la mejor manera de manejar la colocación de widgets simples. Sin embargo, existen patrones comunes que las aplicaciones utilizan en el momento de colocar widgets. Estos patrones pueden estructurarse como algoritmos de diseño configurables que muchas aplicaciones distintas pueden utilizar más de una vez.

SWT define diseños que proporcionan la posibilidad de colocar y asignar tamaño de manera genérica a widgets hijos en un compuesto. Los diseños son subclases de la clase abstracta Layout. Los diseños estándar de SWT se encuentran en el paquete org.eclipse.swt.layout.

Conceptos del diseño de widgets

Es preciso entender algunas definiciones generales para colocar y asignar tamaño a los widgets.

Estos conceptos son importantes para las aplicaciones, independientemente de si se utiliza o no un diseño. Un diseño es una manera eficiente de empaquetar funciones de asignación de tamaño para utilizarlas siempre que se desee.

Los diseños presentan algunos conceptos adicionales.

En Comprender diseños en SWT  encontrará más información e imágenes de muestra sobre estos conceptos.

El siguiente segmento de código muestra un caso simple de una aplicación que utiliza un retorno de llamada de modificación de tamaño para que el tamaño de una etiqueta sea igual que el de su shell padre.

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.addControlListener(new ControlAdapter() {
    public void controlResized(ControlEvent e) {
        label.setBounds (shell.getClientArea ());
    }
});

El siguiente segmento utiliza un diseño para obtener el mismo efecto:

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.setLayout(new FillLayout());

Incluso en este ejemplo simple, utilizar un diseño reduce el código de la aplicación. En el caso de diseños más complejos, la simplificación es mayor.

SWT proporciona tres clases de diseño por omisión que pueden utilizarse en muchas situaciones.

Diseño de relleno

FillLayout es la clase de diseño más simple. Diseña widgets en un sola fila o columna, haciendo que tengan el mismo tamaño. En principio, la altura y la anchura de todos los widgets se ajustará a la de widget más alto y más ancho. FillLayout no se acomoda, por lo que no se pueden especificar márgenes ni espacios.

Puede utilizarse FillLayout para diseñar botones de una barra de tareas o de una barra de herramientas, o para apilar recuadros de selección en un Group.   También se puede utilizar FillLayout cuando Composite sólo tiene un hijo. En el ejemplo anterior, FillLayout hace que la etiqueta rellene completamente su shell padre.

RowLayout

RowLayout también diseña widgets en filas, pero es más versátil que FillLayout. Puede acomodar los widgets, creando tantas filas como se necesiten para visualizarlas. También proporciona márgenes configurables en cada borde del diseño y espacios configurables entre widgets del diseño. Se puede empaquetar RowLayout, lo que hará que todos los widgets tengan el mismo tamaño. Si justifica RowLayout, el espacio adicional que queda en Composite se asignará como márgenes entre los widgets.

La altura y anchura de cada widget en RowLayout puede especificarse en un objeto de RowData que debe establecerse en el widget que utiliza setLayoutData.

Diseño de cuadrícula

GridLayout es el diseño más completo (y más complejo). GridLayout diseña widgets en una cuadrícula, lo que proporciona muchos parámetros configurables que controlan las filas y columnas de la cuadrícula cuando se modifica el tamaño del compuesto.

GridLayout define la API que controla la estrategia general del diseño. El atributo más importante es numColumns, que determina el tamaño horizontal de la cuadrícula. Este valor se suele especificar cuando se diseña el aspecto de la ventana por primera vez. El orden de los widgets en la cuadrícula es el mismo que cuando los creó. Para cambiar el orden de los widgets en la cuadrícula, puede utilizar los métodos moveAbove(Control) y moveBelow(Control) de Control. Estos métodos permiten insertar un widget antes o después de otro en el diseño. ("above" y "below" hacen referencia al orden horizontal de los widgets, no a su ubicación en la cuadrícula).

La tabla siguiente muestra un resumen de los parámetros configurables para GridLayout.

Atributo

Descripción

horizontalSpacing

Número de píxeles entre el borde derecho de una casilla y el borde izquierdo de la casilla adyacente.

makeColumnsEqualWidth

Especifica si deben forzarse todas las columnas para que tengan la misma anchura.

marginWidth

Número de píxeles utilizados para la creación de márgenes en el borde derecho e izquierdo de la casilla.

marginHeight

Número de píxeles utilizados para la creación de márgenes en el borde superior e inferior de la casilla.

numColumns

Número de columnas que deben utilizarse para crear la casilla.

verticalSpacing

Número de píxeles entre el borde inferior de una casilla y el borde superior de la casilla adyacente.

GridLayout soporta muchos más parámetros de diseño para cada widget de la casilla. Estas propiedades se especifican en el objeto de GridData. Debe establecer GridData como layoutData para cada widget de la casilla.

La clase GridData define constantes de estilo que le permiten especificar combinaciones de parámetros de diseño utilizadas comúnmente en el constructor de GridData. También puede establecer estos atributos individualmente utilizando los métodos públicos d e GridData.

Puede obtener algunos diseños muy dinámicos y complejos mediante GridData. Aplicando estos valores en diferentes widgets de la cuadrícula se pueden producir muchas combinaciones distintas de diseños. Incluso los diseños más complejos de diálogos pueden especificarse mediante GridData. La posibilidad de que los widgets puedan expandirse por las casillas produce muchos diseños que a veces no tienen la forma de una cuadrícula.

La tabla siguiente muestra un resumen de los parámetros configurables para GridData.   Consulte  Comprender diseños en SWT para obtener una descripción más detallada y ejemplos de capturas de pantallas utilizando los diversos parámetros de cuadrícula.

Atributo

Descripción

grabExcessHorizontalSpace

Especifica si debe aumentarse el tamaño de una casilla para utilizar espacio horizontal adicional disponible en la cuadrícula. Una vez calculados los tamaños de las casillas de la cuadrícula según los widgets y sus datos de cuadrícula, cualquier espacio adicional que quede en el Compuesto se asignará a aquellas casillas que precisan de espacio sobrante.

grabExcessVerticalSpace

Especifica si debe aumentarse el tamaño de una casilla para utilizar espacio vertical adicional disponible en la cuadrícula.

heightHint

Especifica la altura mínima del widget (y, por lo tanto, de la fila que lo contiene).

horizontalAlignment

Puede ser BEGINNING, CENTER, END, FILL. FILL significa que se cambiará el tamaño del widget para que ocupe toda la anchura de su casilla en la cuadrícula.

horizontalIndent

Número de píxeles entre el widget y el borde izquierdo de su casilla en la cuadrícula.

horizontalSpan

Especifica el número de columnas de la cuadrícula en las que debe expandirse el widget. Por omisión, un widget ocupa una casilla en la cuadrícula. Aumentando este valor, puede ocupar más casillas horizontalmente.

verticalAlignment

Puede ser BEGINNING, CENTER, END, FILL. FILL significa que se cambiará el tamaño del widget para que ocupe toda la altura de su casilla en la cuadrícula.

verticalSpan

Especifica el número de filas de la cuadrícula en las que debe expandirse el widget. Por omisión, un widget ocupa una casilla en la cuadrícula. Aumentando este valor, puede ocupar más casillas verticalmente.

widthHint

Especifica la anchura mínima del widget (y, por lo tanto, de la columna que lo contiene).

Diseños personalizados

Puede que alguna vez tenga que escribir su propia clase Layout personalizada. Esto es lo más adecuado si tiene un diseño complejo que se utiliza en distintos lugares de la aplicación. También resulta conveniente si puede optimizar el diseño a partir de sus conocimientos de la aplicación. Antes de construir un diseño personalizado, tome en consideración lo siguiente:

A menos que escriba un diseño genérico pensado para diversos widgets de Composite, es fácil calcular el tamaño y la posición de los hijos en un escuchador de cambio de tamaño. La mayoría de los widgets personalizados de SWT se han escrito de esta manera. Aunque se puede implementar un nuevo widget como una pareja de Composite/Layout, es mejor implementarlo como un Composite que realiza su diseño en un escuchador de cambio de tamaño y calcula su tamaño preferido en computeSize, y no es necesario escribir clases adicionales.

Si todavía cree que necesita una clase de diseño personalizado, es aconsejable implementar en primer lugar el algoritmo de diseño en un escuchador de cambio de tamaño. Esto hace que sea más fácil depurar el algoritmo. Asegúrese de probar los distintos tipos de diseño: de reducción y aumento de tamaño, de acomodación y de corte.  En cuanto el algoritmo esté activo, se puede modificar el factor del código para que sea una subclase de Layout

Los diseños implementan dos métodos:

Encontrará información más detallada sobre diseños personalizados en Comprender diseños en SWT.