Widgets personalizados

Ocasionalmente, talvez você descubra que nenhum dos controles fornecidos no SWT atende à necessidade do aplicativo. Nesse caso, talvez queira estender o SWT implementando o widget próprio personalizado. O SWT fornece um pacote, org.eclipse.swt.custom, que contém controles personalizados que não estão no conjunto núcleo dos controles do SWT, mas são necessários para implementar o workbench da plataforma.

Controle
Propósito
Estilos
Eventos

CCombo

Semelhante ao Combo, mas com um desenho personalizados para permitir a utilização de uma caixa de combinação sem uma moldura. Essa classe foi desenvolvida para a utilização de caixas de combinação dentro das células da tabela.

BORDER, FLAT, READ_ONLY

Dispose, Control*, Selection

CLabel

Similar ao Label, mas suporta recorte de texto com elipses. Suporta também um efeito gradual para as cores do plano de fundo vistas na exibição ativa do workbench. Não suporta agrupamento.

CENTER, LEFT, RIGHT, SHADOW_IN, SHADOW_OUT, SHADOW_NONE

Dispose, Control*

CTabFolder

Semelhante ao TabFolder, mas suporta a configuração adicional da aparência visual das guias (superior ou inferior) e molduras.

BORDER, FLAT, BOTTOM, TOP

Dispose, Control*, Selection

CTabItem

Objeto selecionável da interface com o usuário que corresponde a uma guia de uma página em um CTabFolder.

 
Dispose, Control*

SashForm

Controle composto que forma o layout de seus filhos em uma organização de linha ou coluna e utiliza um Sash para separá-los de forma que o usuário possa redimensioná-los.

BORDER,HORIZONTAL, VERTICAL

Dispose, Control*

ScrolledComposite

Controle composto que rola seu conteúdo e opcionalmente expande seu conteúdo para preencher o espaço disponível.

BORDER, H_SCROLL, V_SCROLL

Dispose, Control*

StyledText

Controle editável que permite ao usuário digitar texto. Os intervalos de texto dentro do controle podem ter fontes e cores distintas (primeiro e segundo planos).

BORDER, FULL_SELECTION, MULTI, SINGLE, WRAP, READ_ONLY

Dispose, Control*, ExtendedModify, LineGetBackground, LineGetSegments, LineGetStyle, Modify, Selection, Verify, VerifyKey

TableTree

Controle selecionável que exibe uma lista hierárquica de itens que podem ser selecionados pelo usuário. Os itens são representados em linhas que exibem várias colunas representando aspectos diferentes dos itens.

BORDER, SINGLE, MULTI, CHECK, FULL_SELECTION

Dispose, Control*, Selection, DefaultSelection, Collapse, Expand

TableTreeItem

Objeto selecionável da interface com o usuário que representa uma hierarquia de itens da árvore em um TableTree.

 
 

ViewForm

Controle composto que forma o layout de três filhos horizontalmente e permite o controle programático dos parâmetros de layout e moldura. Utilizado no workbench para implementar etiqueta/barra de ferramentas/barra local do menu de uma exibição.

BORDER, FLAT

Dispose, Control*

Control* = Evento herdados do Controle:  FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize

Antes de implementar um widget personalizado, você deve considerar várias questões importantes:

Depois de determinar a necessidade de um widget personalizado e de ter decidido quais plataformas devem ser suportadas, você pode considerar várias técnicas de implementação do widget. Essas técnicas podem ser mescladas e combinadas, dependendo do que está disponível na plataforma do sistema operacional subjacente.

Implementação nativa

Se o aplicativo exige um widget nativo que não seja fornecido pelo SWT, será necessário implementá-lo de forma nativa. Ele pode ser um widget da plataforma, de terceiros ou qualquer outro em uma biblioteca compartilhada da plataforma.

Cada plataforma do SWT vem com uma biblioteca compartilhada (por exemplo, um DLL no Windows) e um JAR (para arquivos de classe Java). A biblioteca compartilhada contém todas as funções nativas necessárias no SWT, mas ela não é um conjunto completo das funções disponíveis na plataforma. Para expor a função nativa ou os widgets nativos que não eram expostos pelo SWT, você precisa gravar sua própria biblioteca compartilhada. Se está utilizando uma combinação de código nativo em uma plataforma e código portátil em outra, não esqueça de chamar a biblioteca compartilhada na plataforma com o widget nativo ou o jar na plataforma com o widget portátil.

Para implementar um widget nativo, você deve compreender a Interface Java Nativa (JNI, Java Native Interface), a API do widget na biblioteca compartilhada e as APIs de plataforma do sistema operacional adjacente em C.

O processo básico da implementação é decidir qual parte da API do widget nativo será exposta na API Java e gravar o código Java que chama os nativos para implementar o comportamento. O código C da JNI deve ser gravado para chamar a biblioteca compartilhada.

É bom seguir os princípios de design utilizados para implementar o SWT durante a construção de implementação do widget próprio nativo. Por exemplo, as JNI nativas devem mapear um para um com as chamadas da API feitas para a biblioteca compartilhada.

Um exemplo completo de implementação de um widget personalizado nativo pode ser encontrado emCriando Widget Próprios Utilizando o SWT.

Estendendo um widget existente

Se o widget é semelhante em conceito ou implementação a um widget existente, talvez você queira agrupar um widget existente no SWT. Essa técnica é utilizada para a implementação de TableTree.

Para agrupar um widget, crie uma classe filha do widget Composite ou Canvas (dependendo da condição do controle ter ou não filhos).No construtor do widget personalizado, crie um widget agrupado. O widget resultante será 100% Java portátil, pois você está chamando a API do widget agrupado para a implementação.

Agrupar um widget é muitas vezes uma maneira mais simples de implementar widgets personalizados do que partir do zero. No entanto, é preciso ser cuidadoso no design da API do novo widget. Eis aqui algumas dicas importantes:

Considere se o widget é um "tipo de" widget agrupado ou se apenas utiliza um para sua implementação. Por exemplo, uma árvore da tabela não é um tipo de tabela. Ela não se refere aos itens pelo índice de número de linha. O TableTree apenas utiliza uma tabela para implementar a apresentação e inclui o comportamento de árvore.Se for agrupar um widget simplesmente por razões de implementação, a API talvez não fique semelhante à API do widget subjacente.

Transfira o mínimo possível de métodos e eventos. Não reimplemente a API toda do widget agrupado ou você estará constantemente brincando de pegar quando a API agrupada for alterada em uma release futura. Métodos comuns na maioria do widgets, como setFont, setForeground, setBackground, devem ser transferidos.

Se você perceber que está implementando a maior parte da API do widget agrupado, considere a exposição do widget agrupado no nível da API e permita que o código do aplicativo utilize o widget agrupado diretamente. Neste caso, talvez você queira reconsiderar se fornecer um novo widget realmente faz sentido. Talvez seja melhor implementar seu recurso como um"adaptador", o qual inclui comportamento a um widget mas não tem a intenção de ser um widget. (Os visualizadores do JFace seguem esse padrão).

Nota:  esta discussão centralizou-se exclusivamente na extensão do comportamento de um widget através do seu agrupamento. Estender um widget dividindo-o em classes filha não é recomendável, pois ele irá tornar o widget dependente da implementação da superclasse.

Implementação de desenho personalizado

Em alguns casos, você não tem qualquer código nativo ou widgets existentes que ajudem na implementação do novo widget. Isso significa que você mesmo deve desenhar o widget, utilizando chamadas de gráficos. Embora essa técnica possa tornar-se bastante complicada, ela tem a vantagem de produzir uma implementação completamente portátil.

Os controles de desenho personalizado são implementados através da divisão da classe Canvas ou Composite em classes filha, utilizando estas regras:

Em um controle de desenho personalizado, seu estado interno é mantido nas variáveis de ocorrência Java. Você define a API e os estilos de acordo com as necessidades do widget.

A implementação interna de um widget de desenho personalizado normalmente envolve estas tarefas importantes:

Muitos dos widgets implementados em org.eclipse.swt.custom utilizam essa abordagem.Um exemplo simples pode ser encontrado em CLabel.

Informações adicionais sobre widgets personalizados podem ser localizadas em Criando seus próprios widgets utilizando o SWT.

Copyright IBM Corporation e outros 2000, 2003.