SWT contiene muchas características interesantes, pero todo lo que se necesita para implementar aplicaciones sólidas y útiles es un conocimiento básico del núcleo del sistema, formado por widgets, diseños y eventos.
Cuando contribuye con elementos de UI utilizando extensiones del entorno de trabajo de la plataforma, el entorno de trabajo maneja automáticamente la mecánica de iniciar SWT.
Si escribe una aplicación de SWT desde cero fuera del entorno de trabajo, debe entender algunos conceptos más sobre la estructura de aplicaciones de SWT.
Una aplicación de SWT autónoma estándar tiene la estructura siguiente:
El fragmento de código siguiente es una adaptación procedente de la aplicación org.eclipse.swt.examples.helloworld.HelloWorld2. Puesto que la aplicación solo visualiza la serie "Hello World", no hace falta que se registre para ningún evento de widget.
public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER); label.setText ("Hello_world"); label.setBounds (shell.getClientArea ()); shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); }
La pantalla (clase Display) representa la conexión entre el SWT y el sistema de la GUI de la plataforma subyacente. Las pantallas se utilizan principalmente para gestionar el bucle de eventos de la plataforma y controlar la comunicación entre la hebra de UI y otras hebras. (En el tema Aspectos de hebras para los clientes hallará una explicación completa sobre los aspectos de las hebras de la UI).
En la mayoría de las aplicaciones, puede seguir el patrón utilizado anteriormente. Debe crear una pantalla antes de crear ventanas, y debe desecharla cuando se cierre la shell. No tendrá que preocuparse de la pantalla a menos que diseñe una aplicación multihebra.
Una Shell es una "ventana" gestionada por el gestor de ventanas de la plataforma de OS. Las shells de nivel superior son las que se crean como hijas de la pantalla. Estas ventanas son las que los usuarios mueven, cambian de tamaño, minimizan y maximizan mientras utilizan la aplicación. Las shells secundarias son las que se crean como hijas de otra shell. Estas ventanas se suelen utilizar como ventanas de diálogo u otras ventanas transitorias que solo existen en el contexto de otra ventana.
Todos los widgets que no sean shells de nivel superior deben tener un padre. Las shells de nivel superior no tienen padre, pero se crean asociadas a una clase Display concreta. Puede acceder a esta pantalla mediante el método getDisplay(). Todos los demás widgets se crean como descendientes (directos o indirectos) de las shells de nivel superior.
Los widgets de Composite son los que pueden tener hijos.
La ventana de una aplicación puede considerarse como un árbol de widgets, o jerarquía, cuya raíz es la shell. En función de la complejidad de la aplicación, podría ser un solo hijo de la shell, varios hijos o capas anidadas de compuestos con hijos.
Cuando la aplicación crea un widget, SWT crea inmediatamente el widget de la plataforma subyacente. Esto elimina la necesidad de utilizar código que opere de manera diferente en función de si existe el widget del OS subyacente. También permite que una gran mayoría de los datos del widget se conserve en la capa de la plataforma, en lugar de replicarse en el juego de herramientas. Esto significa que el concepto de ciclo de vida de un widget del juego de herramientas debe estar en conformidad con las reglas del sistema de la GUI subyacente.
La mayoría de las plataformas de GUI exigen que se especifique un patrón cuando se crea un widget. Puesto que SWT crea un widget de la plataforma en cuanto usted crea un widget del juego de herramientas, hay que especificar el widget padre en el constructor del widget.
Algunas de las propiedades de los widgets deben establecerse en el OS en el momento de crear el widget, y no pueden cambiarse subsiguientemente. Por ejemplo, una lista puede tener una o varias opciones de selección y puede tener o no barras de desplazamiento.
Estas propiedades, llamadas estilos, deben establecerse en el constructor. Todos los constructores de widgets toman un argumento int que especifica el operador OR a nivel de bits de todos los estilos deseados. En algunos casos, a un estilo concreto se le considera una sugerencia, que significa que puede que no esté disponible en todas las plataformas, pero que no se tendrá en cuenta en las plataformas que no lo soportan.
Las constantes de estilo se encuentran en la clase SWT como campos estáticos públicos. Encontrará una lista de las constantes aplicables para cada clase de widget en el manual de consulta de las API de SWT.
Las plataformas de OS de SWT exigen que los recursos de OS se asignen y liberen de manera explícita. De acuerdo con el planteamiento del diseño de SWT, que consiste en reflejar la estructura de la aplicación de la plataforma en el juego de herramientas de widgets, SWT exige que usted libere explícitamente todos los recursos de OS que haya asignado. En SWT, se utiliza el método Widget.dispose() para liberar los recursos asociados a un objeto concreto del juego de herramientas.
La regla empírica consiste en que si crea el objeto, debe desecharlo. A continuación se proporcionan algunas reglas de procedimiento específicas que ayudan a entender este planteamiento:
Existe una excepción a estas normas. Los objetos de datos simples, como el rectángulo (clase Rectangle) y el punto (clase Point), no utilizan recursos del sistema operativo. No tienen el método dispose() y no hace falta liberarlos. En caso de duda, compruebe si en el javadoc existe una clase concreta.
En el tema Gestionar los recursos operativos hallará una descripción más detallada sobre esta cuestión.