s Gráficos

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ê. Entretanto, se o aplicativo exibir 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 em um controle (o caso mais comum), em uma imagem, em um vídeo ou em 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 descartar o GC quando terminar de utilizá-lo.

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. Também é possível consultar uma Font por seus FontData.

Você deve descartar uma Font alocada depois de concluir a sua utilização.

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 uma cor alocada depois de concluir a sua utilização.

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

O modelo de cores é abordado em detalhes no artigo Modelo 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 da cor utilizada. ImageData é uma descrição independente de dispositivo e de plataforma de uma imagem.

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:

Independentemente de como você cria a Image, 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. A mesma regra abordada 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. Você devem sempre fazer 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. Entretanto, isso é normalmente 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 S.O. O desenho fora do método de pintura destrói as otimizações da plataforma e pode causar erros, dependendo do número de pinturas pendentes na fila de eventos.

Ao receber um evento de pintura, você receberá 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 framento 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.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);
      }
   });

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 ouvinte 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 fragmento de código mostra uma versão um pouco modificada do nosso ouvinte de pintura. Neste exemplo, ele aloca e libera a cor vermelha durante a pintura.

   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();
      }
   });

Copyright IBM Corporation e outros 2000, 2003.