SWT proporciona un sólido motor de gráficos para dibujar gráficos y visualizar imágenes en widgets. Se pueden obtener excelentes resultados sin ni siquiera programar la interfaz de gráficos, ya que los widgets ilustran iconos, texto y otros datos en su lugar. Si la aplicación visualiza gráficos personalizados o si implementa un widget de dibujos personalizados, deberá entender cómo funcionan algunos objetos de dibujo básicos en SWT.
El contexto de gráficos, GC, es el punto focal para soportar gráficos de SWT. Su API describe todas las posibilidades de dibujo en SWT.
Un GC puede utilizarse para dibujar en un control (el caso más habitual) o en una imagen, pantalla o impresora. Cuando se dibuja en un control, se utiliza el GC que se suministra en el evento de pintura del control. Cuando se dibuja en una imagen, pantalla o impresora, debe crear un GC configurado para dicha imagen, pantalla o impresora (y desecharlo cuando ya no lo necesite).
En cuanto obtenga un GC, podrá establecer sus atributos, como color, ancho de línea y font, los cuales controlan el aspecto del dibujo de los gráficos en elGC.
El manual de consulta de la API paraGC describe todas las funciones gráficas.
Las clases Font y FontData se utilizan para manipular fonts en SWT.
FontData describe las características de un font. Puede crear una clase FontData especificando un nombre, estilo y tamaño de font. FontData incluye la API para consultar estos atributos. Puesto que la clase FontData no asigna ningún recurso de OS, no tiene que desecharla.
La clase Font es el objeto de gráfico real que representa un font y se utiliza en la API de dibujo. Puede crear una clase Font para un Display especificando Display y FontData del font que desea. También puede consultar un Font para su FontData.
Debe desechar la clase Font cuando ya no tenga que utilizarla.
Los colores son parecidos a los fonts. Debe crear un Color para un Display especificando los valores RGB (rojo, amarillo y azul) para el color deseado. Cuando ya no necesite un color, debe desecharlo.
El método getSystemColor de Display le permite consultar los colores del sistema predefinidos para la plataforma de OS. No debe liberar los colores obtenidos mediante este procedimiento.
El modelo del color se trata detalladamente en el artículo Modelo de color de SWT.
Las clases Image, ImageData e ImageLoader su utilizan para manipular imágenes en SWT.
ImageData describe los píxeles reales de la imagen utilizando la clase PaletteData para describir los valores de color utilizados en la imagen. ImageData es una descripción, independiente del dispositivo y de la plataforma, de una imagen.
ImageLoader carga y guarda ImageData en formatos de archivo distintos. SWT soporta actualmente las operaciones de cargar y guardar formatos de imágenes BMP (Bitmap de Windows), ICO (Icono de Windows), JPEG, GIF y PNG.
La clase Image es el objeto de gráfico real que representa la imagen y se utiliza en la API de dibujo. Debe crear una imagen para Display concreto. Las imágenes pueden crearse de varias maneras:
Independientemente de cómo haya creado la clase Image, usted es quien debe desecharla.
La mayoría de los objetos de gráficos utilizados para dibujar en SWT asignan recursos en el OS subyacente y deben liberarse explícitamente. Aquí se aplica el mismo método práctico que se ha descrito anteriormente. Si los crea utilizando un constructor, debe liberarlos. Si accede a ellos desde otro lugar, no debe liberarlos.
Los objetos de gráficos, tales como contextos de gráficos, fonts, colores e imágenes se asignan en el OS, en cuanto se crean. La manera como piensa utilizar los objetos de gráficos determina el momento en que debe crearlos.
Si va a utilizar objetos de gráficos de manera intensiva en la aplicación, puede crearlos en el momento de crear los widgets. Esto suele hacerse en el caso de colores y fonts. En otros casos, es más adecuado crearlos de manera momentánea. Por ejemplo, podría crear un contexto de gráfico en uno de los manejadores de eventos de widget para efectuar algunos cálculos.
Si implementa un widget personalizado, generalmente debe asignar objetos de gráficos en el constructor si los va a utilizar siempre. Si no los va a utilizar siempre o si dependen del estado de algunos atributos, puede asignarlos de manera espontánea.
Una vez haya asignado los objetos de gráficos, ya puede ilustrarlos. La ilustración siempre debe llevarse a cabo en un escuchador de ilustración. Existen muy pocos casos (particularmente al implementar widgets personalizados) en que la ilustración se realiza mientras se responde a otro evento. Esto resulta desalentador. Si necesita efectuar una ilustración mientras maneja otro evento, debe utilizar el método redraw en primer lugar, que generará otro evento de ilustración en el OS. Si se dibuja sin utilizar este método, no se podrán efectuar optimizaciones de plataforma y podrían producirse anomalías dependiendo del número de ilustraciones pendientes que haya en la cola de eventos.
Si recibe un evento de ilustración, se le suministrará un GC preconfigurado para dibujar en el widget. No debe liberar este GC, ya que no lo creó.
Deben asignarse otros objetos de gráficos mientras maneja el evento (o previamente). A continuación, se muestra un segmento basado en el ejemplo org.eclipse.swt.examples.HelloWorld5. El color rojo se asignó previamente al crear el widget, por lo que puede utilizarse aquí.
shell.addPaintListener(new PaintListener () {
public void paintControl(PaintEvent event){
GC gc = event.gc;
gc.setForeground(red);
Rectangle rect =
event.widget.getClientArea();
gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
}
});
Todos los objetos de gráficos que se han asignado deben liberarse una vez ya no se necesiten.
El momento de la eliminación depende de cuándo se creó el objeto. Si crea un objeto de gráficos mientras crea el widget, generalmente deberá añadir un escuchador de eliminación en el widget y desechar los gráficos cuando se deseche el widget. Si crea un objeto momentáneamente, deberá desecharlo cuando acabe de ilustrarlo.
El siguiente segmento de código, muestra una versión ligeramente modificada del escuchador de ilustración. En este ejemplo, se asigna y libera el color rojo mientras se efectúa la ilustración.
shell.addPaintListener(new PaintListener () {
public void paintControl(PaintEvent event){
GC gc = event.gc;
Color red = new Color(event.widget.getDisplay(), 0xFF, 0, 0);
gc.setForeground(red);
Rectangle rect =
event.widget.getClientArea();
gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
red.dispose();
}
});