Gráficos

O SWT fornece um mecanismo de gráficos robusto para a criação de gráficos e a exibição de imagens nos widgets. Pode-se obter muito sem precisar programar a interface gráfica, pois os widgets manipulam a pintura dos ícones, o texto e outros dados para você. Se o aplicativo exibe gráficos personalizados ou se você está implementando um widget de desenho personalizado, será necessário compreender alguns objetos de desenho básicos no SWT.

Contexto gráfico

O contexto gráfico, GC é o ponto focal do suporte a gráficos do SWT. Sua API descreve todas as capacidades de desenho do SWT.

Um GC pode ser utilizado para desenhar um controle (o caso mais comum) ou para desenhar uma imagem, um display ou uma impressora. Ao desenhar um controle, você utiliza o GC fornecido no evento de pintura do controle. Ao desenhar em uma imagem, um vídeo ou uma impressora, você deve criar um GC configurado para ele (e descartá-lo quando terminar de utilizar).

Depois de obter um GC, você pode definir seus atributos, como cor, espessura da linha e fonte, os quais controlam a aparência dos gráficos desenhados no GC.

A Referência da API para GC descreve o conjunto completo de funções gráficas.

Fontes

As classes Font e FontData são utilizadas durante a manipulação de fontes no SWT.

FontData descreve as características de uma fonte. Você pode criar uma FontData especificando o nome, o estilo e o tamanho da fonte. FontData inclui API para consulta desses atributos. Como FontData não aloca recursos do sistema operacional, não é necessário descartá-la.

A Font é o objeto gráfico real de representação de uma fonte utilizado na API de desenho. Você cria uma Font para um Display especificando o Display e a FontData da fonte desejada. Você pode também consultar a FontData na Font .

Você deve descartar a Font quando tiver terminado de utilizá-la.

Cores

As cores são semelhantes às fontes. Você cria uma Cor para um Display especificando os valores de RGB da cor desejada. Você deve descartar a cor quando terminar de utilizá-la.

O método de Display getSystemColor permite consultar as cores predefinidas do sistema para a plataforma do sistema operacional. Você não deve liberar as cores obtidas através dessa técnica.

O gabarito de cores é discutido detalhadamente no artigo Gabarito de Cores do SWT.

Imagens

As classes Image, ImageData e ImageLoader são utilizadas durante a manipulação de imagens do SWT.

ImageData descreve os pixels reais da imagem, utilizando a classe PaletteData para descrever os valores de cor utilizados na imagem. ImageData é uma descrição de uma imagem, independentemente de dispositivo e plataforma.

ImageLoader carrega e salva ImageData em diferentes formatos de arquivo. Atualmente, o SWT suporta carregamento e salvamento de formatos de imagem BMP (Windows Bitmap), ICO (Windows Icon), JPEG, GIF e PNG.

A Image é o objeto gráfico real representando a imagem utilizada na API de desenho. Você cria uma imagem para um Display específico. As imagens podem ser criadas de várias maneiras:

Não importa como aImage é criada, você é o responsável por descartá-la.

Ciclo de vida do objeto gráfico

A maioria dos objetos gráficos utilizados para desenhar no SWT aloca recursos no sistema operacional subjacente e deve ser explicitamente liberada. O mesmo princípio básico discutido anteriormente aplica-se aqui. Se você o criou utilizando um construtor, deve liberá-lo. Se você obtém acesso a ele de algum outro lugar, não o libere.

Criação

Os objetos gráficos, como contextos, fontes, cores e imagens gráficos são alocados no sistema operacional assim que o objeto é criado. Como você planeja utilizar os objetos gráficos determina quando deve criá-los.

Para objetos gráficos bastante utilizados por todo o aplicativo, você pode criá-los no momento da criação dos widgets. Isso é feito normalmente para cores e fontes. Em outros casos, é mais apropriado criar os objetos gráficos instantaneamente. Por exemplo, você pode criar um contexto gráfico em uma de suas rotinas de tratamento de evento do widget para executar alguns cálculos.

Se está implementando um widget personalizado, você geralmente aloca objetos gráficos no construtor, se os utiliza com freqüência. Você pode alocá-los instantaneamente se não forem utilizados com freqüência ou se dependerem do estado de algum atributo.

Pintando

Depois de alocar os objetos gráficos, você estará pronto para pintar. Faça a pintura dentro de um atendente de pintura. Há casos raros (particularmente durante a implementação de widgets personalizados) nos quais a pintura é feita durante a resposta a algum outro evento. Geralmente, isso é desencorajado. Se você acha que precisa pintar durante a manipulação de algum outro evento, deve primeiro tentar utilizar o método redraw, o qual irá gerar outro evento de pintura no sistema operacional. O desenho fora do método de pintura destrói as otimizações da plataforma e pode até mesmo causar erros, dependendo do número de pinturas pendentes na fila de eventos.

Quando você recebe um evento de pintura, recebe com um GC pré-configurado para desenhar no widget. Não libere esse GC! Você não o criou.

Qualquer outro objeto gráfico deve ser alocado durante a manipulação do evento (ou antecipadamente). Abaixo há um snippet com base no exemplo org.eclipse.swt.examples.HelloWorld5. A cor vermelha foi alocada anteriormente, durante a criação do widget, portanto, ela pode ser utilizada aqui.

shell.addPaintatendente(new Paintatendente () {
    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);
    }
});

Disposição

Todos os objetos gráficos alocados devem ser liberados depois de utilizados.

A sincronização da disposição depende de quando o objeto foi criado. Se o objeto gráfico é criado durante a criação do widget, você deve geralmente incluir um atendente de descarte no widget e descartar os gráficos quando o widget for descartado. Se você criar um objeto durante a pintura, deverá descartá-lo quando a pintura terminar.

O próximo snippet de código mostra uma versão um pouco modificada do nosso atendente de pintura. Neste exemplo, ele aloca e libera a cor vermelha durante a pintura.

shell.addPaintatendente(new Paintatendente () {
    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();
    }
});