Widgets personalizados

Puede darse el caso de que ninguno de los controles que SWT proporciona satisfaga las necesidades de la aplicación. Si es así, puede ampliar SWT implementando el widget personalizado. SWT proporciona el paquete org.eclipse.swt.custom, que contiene controles personalizados que no se encuentran en el conjunto principal de controles de SWT, pero que se necesitan para implementar el entorno de trabajo de la plataforma.

Control

Finalidad

Estilos

AnimatedProgress

Control estático que muestra animación durante la ejecución de una operación larga.

BORDER, HORIZONTAL, VERTICAL

CCombo

Similar a Combo, pero dibujado de manera personalizada para poder utilizar una combinación sin borde. Esta clase de ha desarrollado para utilizar combinaciones en casillas de tabla.

BORDER, FLAT, READ_ONLY

CLabel

Similar a Label, pero soporta corte de texto con puntos suspensivos. También soporta un efecto gradual del color de fondo tal como se ve en la vista de entorno de trabajo activa. No soporta acomodación.

CENTER, LEFT, RIGHT, SHADOW_IN, SHADOW_OUT, SHADOW_NONE

CTabFolder

Similar a TabFolder, pero soporta la configuración del aspecto visual de pestañas (superiores o inferiores) y bordes.

BORDER, BOTTOM, TOP

SashForm

Control de Composite que diseña sus hijos en filas y columnas y utiliza Sash para separarlos de manera que el usuario pueda modificar su tamaño.

BORDER,HORIZONTAL, VERTICAL

ScrolledComposite

Control de Composite que desplaza su contenido y opcionalmente lo estira para ocupar el espacio disponible.

BORDER, H_SCROLL, V_SCROLL

StyledText

Control que puede editarse y que permite al usuario escribir texto. Los rangos del texto dentro del control pueden tener distintos fonts y colores (primer plano y fondo).

BORDER, FULL_SELECTION, MULTI, SINGLE, READ_ONLY

TableTree

Control que puede seleccionarse y que muestra una lista jerárquica de elementos que el usuario puede seleccionar. Los elementos se muestran en filas que visualizan varias columnas que representan distintos aspectos de los elementos.

BORDER, SINGLE, MULTI, CHECK, FULL_SELECTION

ViewForm

Control de Composite que diseña tres hijos horizontalmente y permite el control programático de los parámetros de diseño y borde. Se utiliza en el entorno de trabajo para implementar la etiqueta/barra de herramientas/barra local de menús de una vista.

BORDER,FLAT

Antes de implementar un widget personalizado, debe tomar en consideración varios aspectos importantes:

Una vez haya determinado que necesita un widget personalizado y decidido qué plataformas deben soportarse, puede tomar en consideración varios procedimientos de implementación para el widget. Estos procedimientos pueden combinarse y emparejarse dependiendo de lo que está disponible en la plataforma de OS subyacente.

Implementación nativa

Si la aplicación requiere un widget nativo que SWT no proporciona, tendrá que implementarlo de manera nativa. Podría tratarse de un widget de plataforma, de un widget de otra compañía o de cualquier otro widget de una biblioteca compartida de plataforma.

Cada plataforma de SWT se envía con una biblioteca compartida (por ejemplo, DLL en Windows) y un JAR (para los archivos de clase Java). La biblioteca compartida contiene todas las funciones nativas necesarias para SWT, pero esto no significa que formen un conjunto completo de las funciones disponibles en la plataforma. Para exponer funciones nativas o widgets nativos que SWT no ha mostrado, debe escribir su propia biblioteca compartida. Si utiliza código nativo en una plataforma y código portátil en otra, asegúrese de que llama a la biblioteca compartida en la plataforma que contiene el widget nativo, y al jar en la plataforma que contiene el widget portátil.

Para implementar un widget nativo, debe entender la Interfaz nativa de Java (JNI), la API del widget de la biblioteca compartida y las API de la plataforma de OS subyacente de C.

El proceso básico para efectuar una implementación es decidir qué parte de la API del widget nativo se expondrá en la API de Java y escribir el código Java que llama a los nativos que implementan la función. Para llamar a la biblioteca compartida debe escribirse código C de JNI.

Es aconsejable seguir las reglas de diseño utilizadas para implementar SWT al construir su propia implementación de widget nativo. Por ejemplo, los nativos de JNI deben correlacionarse individualmente con las llamadas de API que se efectúan en la biblioteca compartida.

En Crear sus propios widgets utilizando SWT, encontrará un ejemplo completo de una implementación personalizada de widget nativo.

Ampliar un widget existente

Si el nuevo widget es similar en cuanto a concepto o implementación con un widget existente, tal vez desee acomodar un widget de SWT existente. Este procedimiento se utiliza para implementar TableTree.

Para acomodar un widget, cree una subclase del widget Composite o Canvas (dependiendo de si el control tiene hijos o no). En el constructor del widget personalizado, cree el widget acomodado. El widget resultante será totalmente Java ya que llama a la API del widget acomodado para implementarlo.

Acomodar un widget, en lugar de iniciarlo desde el principio, suele ser la manera más simple de implementar widgets personalizados. Sin embargo, debe actuar con precaución a la hora de diseñar la API del nuevo widget. A continuación se proporcionan algunos consejos importantes:

Determine si el widget es un "tipo de" widget acomodado o si sólo utiliza uno para su implementación. Por ejemplo, un árbol de tablas no es un tipo de tabla. No hace referencia a los elementos por índice de número de filas. TableTree sólo utiliza una tabla para implementar la presentación y añade funciones de árbol. Si acomoda un widget únicamente por motivos de implementación, la API puede no ser parecida a la API del widget subyacente.

Reenvíe cuantos métodos y eventos sea posible. No vuelva a implementar toda la API del widget acomodado o tendrá que realizar capturas constantemente cuando la API acomodada se modifique en un futuro release. Deben reenviarse los métodos comunes a la mayoría de los widgets, comosetFont, setForeground y setBackground.

Si tiene que implementar la mayoría de la API del widget acomodado, tal vez desee exponer el widget acomodado en el nivel de la API y dejar que el código de la aplicación lo utilice directamente. En este caso, debería tomar en consideración si proporcionar un nuevo widget tiene sentido. Tal vez sería mejor implementar la característica como un "adaptador" que añade funciones a un widget pero que no pretende suplantarlo. (Los visores de JFace siguen este patrón.)

Nota:  Lo tratado hasta ahora se ha centrado únicamente en ampliar las funciones de un widget acomodándolo. Ampliar un widget haciendo que sea una subclase es totalmente desaconsejable ya que dicho widget dependería de la implementación de la superclase.

Implementación de un diseño personalizado

Podría darse el caso de que no tiene ningún código nativo o widgets existentes que le ayuden a implementar el nuevo widget. Esto significa que debe diseñar el widget usted mismo utilizando llamadas de gráficos de SWT. Aunque este procedimiento puede resultar bastante complicado, tiene la ventaja de producir una implementación totalmente portátil.

Los controles de gráficos personalizados se implementan convirtiendo en subclases las clases Canvas o Composite siguiendo estas reglas:

En un control de diseño personalizado, el estado interno se mantiene en variables de instancia de Java. Debe definir la API y los estilos de acuerdo con los requisitos del widget.

Par implementar un diseño personalizado de manera interna suele ser preciso llevar a cabo estas tareas básicas.

La mayoría de los widgets implementados en org.eclipse.swt.custom utilizan este planteamiento. Encontrará un ejemplo simple en CLabel.

En Crear sus propios widgets utilizando SWT, encontrará más información sobre cómo personalizar widgets.