Jueves, 19 de mayo de 2011
Publicado por Tecnonucleo @ 6:54  | SWT
Comentarios (0)  | Enviar

SWT cuenta con dos clases con las que es posible armar un splitter: SashForm y Sash. SashForm es de más alto nivel y actúa como un contenedor ya que es una especialización de Composite. Sin embargo, posee algunas limitaciones como ser que no es posible dejar una de las partes del splitter fija cuando se ejecuta un resize. Por lo tanto, si queremos más control sobre el splitter será necesario utilizar el widget Sash. Este último es mucho más básico. Solo proporciona el aspecto del widget en sí mismo, la lógica del drag & drop y el correspondiente evento.
Existen varios ejemplos que muestran cómo utilizar Sash, como el snipped proporcionado en el site de Eclipse. Sin embargo, por alguna extraña razón todos estos ejemplos utilizan FormLayout como organizador para el contenido de los Composites. En lo personal prefiero utilizar GridLayout, por lo que me vi en la obligación de tener que armar la lógica para el splitter desde cero. Realmente no es muy complicado, pero no está de más un post para publicar el resultado.

Lo que queremos lograr es algo parecido a lo que sigue:



Hay solo dos formas de redimensionar los componentes de la ventana de ejemplo: cambiando la posición del splitter o redimensionando la ventana completa.
Cuando un usuario cambia el tamaño de la ventana, la idea es que el panel de la izquierda se contraiga o expanda, permaneciendo el de la derecha con su ancho inalterable. La única forma de modificar el ancho del panel derecho es utilizando el splitter, el cual se muestra en la imagen en color azul.
Al final del post pueden acceder al link para descargar el archivo con el código del ejemplo completo, pero una de las partes en las que vale la pena detenerse es en la programación del evento "widgetSelected". Este es el evento que se dispara cuando el Sash es arrastrado y posteriormente soltado:

01     protected void mobjSplitter_widgetSelected(SelectionEvent e) {
02         Rectangle rctSplitter;
03         int intNewVerticalPosition;
04         int intChange;
05         GridData datCanvas;
06 
07         rctSplitter = mobjSplitter.getBounds();
08         intNewVerticalPosition = e.x;
09 
10         intChange = rctSplitter.x - intNewVerticalPosition;
11         datCanvas = (GridData) mcmpRight.getLayoutData();
12         datCanvas.widthHint += intChange;
13 
14         this.layout();
15     }


Cabe aclarar que cuando el evento es ejecutado, el Sash todavía permanece en la misma posición en la que estaba antes, y seguirá allí a menos que hagamos algo para cambiarlo. La posición en donde se soltó (la que determina la nueva distribución horizontal deseada para ambos paneles) es proporcionada a través del objeto "SelectionEvent", pasado como parámetro al evento. En la línea 08 podemos apreciar su asignación a una variable local. En la línea 10 se calcula la magnitud del cambio y en la 11 y 12 se cambia el ancho del panel derecho. Por último, en la línea 14 se invoca al método "layout" del contenedor inmediatamente superior a los elementos que están siendo reordenados. En este caso se trata del objeto "Shell" que representa la ventana. Mediante esta invocación se logra que el panel derecho y el mismo Sash se adapten al nuevo ancho del panel izquierdo.

Recursos

Código fuente de ejemplo: Descargar


Tags: swt, sash, sashform, gridlayout, fixed position, java

Comentarios