Desenvolvimento - Java

Conhecendo o SWT

O Eclipse tornou-se famoso não apenas por ser uma IDE de primeira qualidade, desenvolvido com a extensibilidade em mente, mas também porque ele tinha uma interface gráfica levíssima e que era igual a do sistema operacional onde ele estivesse executando...

por Maurício Linhares de Aragão Junior



O Eclipse tornou-se famoso não apenas por ser uma IDE de primeira qualidade, desenvolvido com a extensibilidade em mente, mas também porque ele tinha uma interface gráfica levíssima e que era igual a do sistema operacional onde ele estivesse executando, diferentemente do conjunto de componentes gráficos do Java, o Swing, que tinha uma “cara” própria e algumas opções que fazem com que ele “imite” a aparência de um sistema operacional qualquer. Mas essa possibilidade de imitar ainda não era a melhor escolha, porque vários sistemas operacionais tem a opção para aplicar-se temas gráficos e as aplicações Swing não tinham como acompanhar estas mudanças.

Esta interface gráfica do Eclipse foi “separada” do código principal da IDE e tornou-se o que se conhece hoje como SWT, o Standard Widget Toolkit. Ele é uma camada de componentes sobre os componentes padrão do sistema operacional, um botão SWT é na verdade um botão do seu sistema operacional, então, se você aplicar um tema que mude a cor ou a forma do seu botão, o botão SWT vai se modificar conforme o novo tema. Aplicações SWT sempre tem a aparência do sistema operacional que elas executam porque elas utilizam diretamente estes componentes para gerar a visualização na tela. Esta abordagem diferente do Swing, faz com que as aplicações possam se relacionar melhor com o ambiente onde elas estão executando, tornando-as mais naturais para os usuários e até mesmo mais leves, já que ações que exigem muito processamento (como desenhar componentes visuais na tela) são feitos diretamente pelas primitivas do SO e não pela máquina virtual do Java.

Preparando o ambiente

Para seguir esse material você precisa fazer o download da biblioteca do SWT da página do projeto em http://www.eclipse.org/swt/. Procure por “Releases” e depois “Stable”, você deve ver as opções de sistemas operacionais com binários compilados, basta selecionar o seu sistema operacional e fazer o download do arquivo para o seu sistema. Depois de feito o download, descompacte o arquivo e você deve encontrar um arquivo chamado “swt.jar”, esse é o arquivo que contém a biblioteca de componentes e deve ser colocado no classpath da sua aplicação para poder acessar os objetos da biblioteca.

Além desse arquivo você deve encontrar também um conjunto de bibliotecas nativas (no Windows são alguns arquivos com a extensão .DLL, no Linux são arquivos .SO) que também devem ser adicionados a ao classpath da sua aplicação. Se você está utilizando o Eclipse para desenvolvimento, não é necessário fazer o download da biblioteca, pois ela já faz parte do “pacote” do Eclipse e pode ser adicionada a projetos dentro da IDE. Para adicionar o SWT em um projeto do Eclipse 3.2 basta clicar na pasta do projeto com o botão direito, ir pra opção “Build Path”, depois selecionar “Add Library” e adicionar a biblioteca “Standard Widget Toolkit (SWT)”.

Dando os primeiros passos

Agora que já estamos com o ambiente pronto para iniciar, vejamos nosso primeiro exemplo de aplicação SWT, é uma simples janela com um botão que conta quantas vezes é clicado, mas que vai nos trazer várias das noções de como é desenvolver uma aplicação real em SWT.

Listagem 1 – org.maujr.ExemploSWT.java

package org.maujr;

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.SelectionAdapter;

import org.eclipse.swt.events.SelectionEvent;

import org.eclipse.swt.layout.RowLayout;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

class ExemploSWT {

private static int selecoes = 0;

public static void main(String[] args) {

Display display = Display.getDefault();

Shell shell = new Shell(display, SWT.CLOSE | SWT.TITLE | SWT.MIN |

"Aprendendo SWT");

button.setText("Clique Aqui Agora!!!");

button.addSelectionListener(new SelectionAdapter() {

@Override

Button buttonClicked = (Button) event.getSource();

selecoes += 1;

buttonClicked.setText(String.format("Fui clicado %s

Como você já percebeu, o código do nosso exemplo é curto e simples, inicialmente, nós pegamos o objeto Display padrão para a aplicação, que é o objeto que faz a ponte entre o sistema de envio de eventos do sistema operacional para os objetos da sua aplicação Java. Ele é o objeto responsável por transformar as chamadas a métodos em objetos Java normais em chamadas a primitivas do sistema operacional, através de uma referência ao objeto OS, que representa o sistema operacional no qual aplicação está sendo executada. Este objeto OS contém diversas implementações em métodos nativos para as chamadas nos componentes visuais reais.

É no Display que também se encontram informações sobre o ambiente onde a aplicação está executando, como a quantidade de monitores disponíveis, os tamanhos recomendados para certos componentes visuais e outras informações mais avançadas, que no momento não nos interessam.

em SWT – O objeto Shell

Terminando com o Display, nós chegamos ao nosso primeiro “componente visual” do SWT, o Shell, que representa uma janela no sistema operacional. Essa janela pode ser qualquer modelo de janela que os vários sistemas operacionais para os quais o SWT tem versões compatíveis, desde a janela principal da aplicação, com um título, os botões para maximizar, minimizar e fechar até telas de diálogo sem bordas de título.

Para definir qual o tipo da janela, nós utilizamos um modo comum para criar objetos em toda a biblioteca SWT, os “style bits” (algo como “bits de estilo”) que informam ao componente visual como ele deve se mostrar. Os “style bits” são conjuntos de constantes que podem ser aplicadas sobre os componentes visuais para que eles assumam características variadas e estão todos declarados na classe SWT. Nela você encontra todos os “style bits” utilizados na biblioteca. Para saber quais são e o que fazem os “style bits” de um componente visual, você deve ver o “Javadoc” do componente, na documentação sempre existe a informação completa de quais são os estilos aplicáveis a um componente e o que cada estilo destes faz.

No caso da nossa janela, nós queríamos que ela fosse uma janela principal do sistema (aquela com os botões de maximizar, minimizar, fechar e uma barra de título), então criamos uma nova janela (passando o Display onde a janela deve aparecer como parâmetro) com os seguintes “style bits”:

SWT.TITLE SWT.MIN SWT.MAX SWT.RESIZE

Os operadores podem ser combinados com o uso do operador “ou” ( “|”) em Java. Se todas as opções forem suportadas e não entrarem em conflito nenhum, todas elas são aplicadas ao componente em questão. Como você viu, no nosso exemplo da criação do Shell, nós definimos os seguintes estilos:

· SWT.CLOSE – Para adicionar o botão de fechar a janela

· SWT.TITLE – Para adicionar uma barra de título a janela

· SWT.MIN – Para adicionar o botão de minimizar a janela

· SWT.MAX – Para adicionar o botão de maximizar a janela

· SWT.RESIZE – Para que o usuário possa redimensionar o tamanho da janela conforme a sua necessidade

Reunindo os vários estilos usando o operador “|” (or/ou), nós fazemos a janela principal padrão dos programas, que tem os botões de maximizar, minimizar, fechar, uma barra de título e ainda pode ser redimensionada.

Outro detalhe importante do modo de trabalho do SWT, é que, diferentemente de outras bibliotecas de componentes (como o Swing), os objetos não são adicionados diretamente aos seus pais (como o método “addComponent()”), os pais de cada componente devem ser passados nos seus construtores. Estranho? Nem tanto. Como o SWT é baseado nas bibliotecas nativas do sistema operacional ele está sempre fazendo acesso a recursos de baixo nível e assim que um componente é instanciado também é criada a referência para o componente real da plataforma nativa, então, para não ter que se preocupar com o ciclo de vida dos componentes nativos, só é possível criar componentes SWT passando a referência do seu componente pai, o que você percebe olhando para o código de instanciação do botão:

while (!shell.isDisposed()) {

display.sleep();


Figura 1 –
Imagem do exemplo executando.

Conclusão

O SWT é uma incrível biblioteca de componentes visuais para aplicações desktop que garantem ter a mesma aparência dos outros componentes visuais do sistema operacional, diferentemente do Swing que mesmo parecendo ser igual, não consegue ter o mesmo feeling dos componentes padrão do sistema. Você viu um exemplo simples, mas que já traz algumas das características principais do SWT, como o uso de “style bits” e os componentes sendo instanciados passando como referência o seu componente pai.

Referências

Clayberg, Eric; Rubel, Dan. 2006. Eclipse – Building Commercial-Quality Plugins. The Eclipse Series. 2º Edition. Addison-Wesley - Pearson Education.

McAffer, Jeff; Lemieux, Jean-Michel; 2006. Eclipse Rich Client Platform – Designing, Coding, and Packaging Java Applications. The Eclipse Series. Addison-Wesley – Pearson Education.

D’Anjou, Jim; Fairbrother, Scott; Kehn, Dan; Kellerman, John; McCarthy, Pat; 2005. The Java Developer’s Guide to Eclipse. Second Edition. Addison-Wesley – Pearson Education.

Scarpino, Matthew; Holder, Stephen; NG, Stanford; Mihalkovic, Laurent; 2005. SWT/JFace in Action – How to design graphical applications with Eclipse 3.0. Manning Publications.

SWT Website - http://www.eclipse.org/swt/

Maurício Linhares de Aragão Junior

Maurício Linhares de Aragão Junior - Graduando em Desenvolvimento de Software para a Internet (CEFET-PB) e Comunicação Social (Habilitação Jornalismo - UFPB), desenvolvedor da Phoebus Tecnologia (http://www.phoebus.com.br/), consultor e instrutor independente, membro da equipe administrativa do Grupo de Usuários Java da Paraíba - PBJUG (http://www.pbjug.org/) e moderador dos fóruns do GUJ (http://www.guj.com.br/).

Ele pode ser contactado também através de sua página pessoal, em http://maujr.org/.