SWT contiene muchas características interesantes, pero un conocimiento básico del núcleo del sistema -widgets, diseños y eventos- es todo lo que se necesita para implementar aplicaciones sólidas y satisfactorias.
Cuando contribuye con elementos de UI utilizando extensiones de entorno de trabajo de plataforma, el entorno de trabajo maneja, en su lugar, los procedimientos para iniciar SWT.
Si escribe una aplicación de SWT desde el principio (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:
Cree una clase Display que represente una sesión de SWT.
Cree uno o más Shells que actúe como la(s) ventana(s) principal(es) de la aplicación.
Cree todos los widgets que necesite dentro del shell.
Inicialice los tamaños y otro estado necesario para los widgets. Registre escuchadores para eventos de widgets que necesiten manejarse.
Abra la ventana del shell.
Ejecute el bucle de envío hasta que se produzca una condición de salida (generalmente, cuando el usuario cierra la ventana principal del shell).
Deseche la pantalla.
El segmento de código siguiente se ha adaptado de la aplicación org.eclipse.swt.examples.helloworld.HelloWorld2. Puesto que la aplicación sólo visualiza la serie "Hello World," no necesita registrarse 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 ();
}
Display representa la conexión entre SWT y el sistema 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. (Consulte Aspectos de hebras para clientes para obtener una información completa sobre los aspectos de hebras de 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 el shell. No tendrá que preocuparse de la pantalla a menos que diseñe una aplicación de varias hebras.
Un Shell es una "ventana" gestionada por el gestor de ventanas de la plataforma de OS. Los shells de nivel superior son los que se crean como hijos de la pantalla. Estas ventanas son las que los usuarios mueven, cambian de tamaño, minimizan y maximizan mientras utilizan la aplicación. Un shell secundario es el que se crea como hijo de otro shell. Estas ventanas suelen utilizarse como ventanas de diálogo u otras ventanas transitorias que sólo existen en el contexto de otra ventana.
Todos los widgets que no son shells de nivel superior tienen un padre. Los shells de nivel superior no tienen un padre, pero todos se crean asociados con una clase Display concreta. Puede acceder a esta pantalla mediante getDisplay(). Los demás widgets se crean como descendientes (directos o indirectos) de shells de nivel superior.
Los widgets de Composite son widgets que pueden tener hijos.
La ventana de una aplicación puede considerarse como un árbol de widgets, o jerarquía, cuya raíz es el shell. Dependiendo de la complejidad de la aplicación, podría ser un solo hijo del shell, varios hijos o capas jerarquizadas de compuestos con hijos.
Cuando la aplicación crea un widget, SWT crea inmediatamente el widget de la plataforma subyacente. Esto hace que no sea necesario utilizar código que opera de manera diferente dependiendo de si el widget del OS subyacente existe. También permite que una gran cantidad de datos del widget se mantenga en la capa de la plataforma en lugar de duplicarlos en el juego de herramientas. Esto significa que el concepto de ciclo de vida de un widget del juego de herramientas debe ajustarse a las reglas del sistema de GUI subyacente.
La mayoría de las plataformas de GUI requieren que se especifique un patrón cuando se crea un widget. Puesto que SWT crea un widget en la plataforma en cuanto usted crea un widget de juego de herramientas, el widget padre debe especificarse en el constructor del widget.
El OS puede establecer algunas propiedades de los widgets en el momento en que se crean, las cuales ya no se pueden modificar. 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 especifican la forma de bit OR de todos los estilos que se deseen. 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 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 constantes aplicables para cada clase de widget en el manual de consulta de API para SWT.
Las plataformas de OS de SWT requieren que los recursos de OS se asignen y liberen de manera explícita. De acuerdo con el planteamiento del diseño de SWT de reflejar la estructura de la aplicación de la plataforma en el juego de herramientas de widget, SWT precisa que se liberen explícitamente todos los recursos de OS que se hayan asignado. En SWT, el método dispose() se utiliza para liberar recursos asociados con un objeto de juego de herramientas concreto.
El método práctico es que si crea el objeto, debe desecharlo. A continuación se proporcionan algunas reglas de procedimiento específicas que ayudan a entender este planteamiento:
Si crea un widget o un objeto de gráfico utilizando un constructor, debe desecharlo manualmente cuando ya no lo necesite.
Si obtiene un widget o un objeto de gráfico sin utilizar un constructor, no debe desecharlo manualmente ya que no lo asignó.
Si pasa una referencia al widget o un objeto de gráfico a otro objeto, debe tener la precaución de no desecharlo mientras esté siendo utilizado. (En Patrones de conector para utilizar imágenes se mostró un ejemplo práctico de este regla.)
Cuando el usuario cierra un Shell, el shell y todos sus widgets hijos de desechan de manera recursiva. En este caso, no tiene que desechar los widgets. Sin embargo, debe liberar todos los recursos de gráficos asignados junto con esos widgets.
Si crea un objeto de gráfico para utilizarlo durante el ciclo de vida de uno de los widgets, debe desecharlo cuando se deseche el widget. Para hacerlo, se ha de registrar un escuchador de eliminación para el widget y liberar el objeto de gráfico cuando se reciba el evento dispose.
No hay ninguna excepción para estas reglas. Los objetos de datos simples,como Rectángulo y Punto, no utilizan recursos del sistema operativo. No incluyen el método dispose() y no tiene que liberarlos. En caso de dudas, compruebe si en el javadoc existe una clase concreta.