Esse artigo faz parte da revista Java Magazine edição 31. Clique aqui para ler todos os artigos desta edição
Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML.
Eclipse Visual
Primeiros Passos com o SWT
Conheça na prática o SWT, que permite criar aplicações gráficas multiplataforma, como responsividade e aparência de aplicações nativas, sem sacrificar a compatibilidade
Fernando Lozano
Ao iniciar o Projeto Eclipse há cerca de cinco anos, a IBM decidiu criar um tookit gráfico alternativo ao Swing – O SWT. Com o tempo e o sucesso do Eclipse, muitos desenvolvedores passaram a considerar seriamente o SWT como alternativa ao tookit gráfico padrão do Java, o Swing Hoje, além de ser adotado no Eclipse e seus muitos plug-ins, o SWT é utilizado por várias aplicações populares, como o RSSOwl, um agregador de notícias RSS (Figura1) e Azureus, um cliente para a rede de compartilhamento de arquivos BitTorrent (e atualmente um dos projetos mais ativos no SourceForge).
Apesar das críticas de que o SWT fragmentaria a plataforma Java, e das discursões inflamadas sobre a qual seria o melhor toolkit gráfico, o SWT é visto por cada vez mais profissionais e empresas como uma alternativa viável (ou superior) para o desenvolvimento de aplicações gráficas com Java.
Este artigo apresenta os primeiros passos no desenvolvimento SWT, para usuários do Eclipse e também para usuários de outros IDEs (Nada obriga o desenvolvedor de aplicações SWT a utilizar o Eclipse).
Todos os exemplos neste artigo foram testados com JVMs livres, entre elas Kaffe, JamVM, SableVM e GCJ – além das JVMs 5.0 e 1.4.2 as Sun.
Figura 1. Aplicação SWT rodando sobre o Kaffe VM em Linux
Arquitetura do SWT
O SWT foi criado para ser ao mesmo tempo poderoso, leve e multiplataforma. Para isso utiliza o máximo possível dos recursos nativos da plataforma, mas sem perder portabilidade. Há versões do SWT diferentes para cada plataforma suportada – estas variam desde o PocketPC com J2MW, até sistemas Linux e Solaris de 64bits, passando por QNX, MAC OS Windows e outras variantes do Unix. Mas a API exposta pelo SWT para aplicações é independente de plataforma, com cad um implementando esta API usando código Java específico.
Nesse sentido, pode-se considerar que o SWT é uma extensão da JVM. Para entender o motivo, podemos fazer uma analogia com a classe java.io.File. Uma aplicação Java utiliza os mesmos métodos de para verificar a existência de um arquivo (exists()) e para obter seu tamanho (length()), mas a implementação destes métodos varia radicalmente para cada plataforma, pois é necessário utilizar os recursos específicos do sistema operacional para essas operações.
O fato da classe File ser implementada de forma diferente em cada plataforma não impede, por exemplo, que uma aplicação Java desenvolvida e compilada em Windows rode sem modificações no Mac OS. Da mesma forma, o fato de se desenvolver uma aplicação SWT utilizando a versão para Linux, não impede que a aplicação seja executada, sem modificações ou recompilação, em Windows ou outras plataformas. Basta que esteja disponível a versão específica do SWT. O uso de código nativo pelo SWT é um detalhe interno da sua implementação, que não afeta as aplicações escritas para este toolkit.
Preparando o ambiente
Na Listagem 1 está uma aplicação SWT simples. Antes de explicar o código, vamos usar essa aplicação para validar a configuração do ambiente de desenvolvimento, e para verificar a instalação do SWT (caso não seja utilizado o Eclipse). Para acompanhar os passos de configuração a seguir, crie um projeto no Eclipse com a nova classe. A Figura 2 mostra a aplicação executando em Linux (Fedora) com Gnome e Windows XP.
Em princípio é possível desenvolver aplicações SWT utilizando apenas o download básico do Eclipse Platform + JDT, ou mesmo sem utilizar o Eclipse em absoluto (veja o quadro "SWT Fora do Eclipse"). Mas o PDE e o plug-in Visual Editor (VE) fornecem capacidades adicionais que poderão interessar ao desenvolvedor. O suporte oferecido pelo PDE e VE, entretanto, ainda é voltado principalmente para o desenvolvimento de plug-ins e não de aplicações SWT independentes. Isso leva alguns a preferir não usar esse suporte. Para os curiosos, Figura 3 mostra a edição de uma tela simples no VE.
Embora seja possível usar o VE sem o PDE, esta configuração fornece apenas suporte ao desenvolvimento Swing e não a SWT.
Devido a mudanças na forma como o Eclipse 3.1 empacota seus plug-ins em relação a versões anteriores, o leitor pode preferir obter o SWT isoladamente, ou então baixar o PDE. (Lembrando que antes da versão 3.1 o PDE não fornecia nenhuma facilidade específica para o desenvolvimento SWT, exceto pela documentação.)
A Tabela 1 apresenta várias configurações possíveis do Eclipse, o tamanho total
de download e recursos oferecidos por cada uma para o desenvolvimento SWT.
Listagem 1. Primeira aplicação SWT:OiSwt.Java___________________
import org.eclipse.swt.SWT;
import org.eclipse.SWT.layaout.RowLayout;
import org.eclipse.SWT.widgets.Display;
import org.eclipse.SWT.widgets.Label;
import org.eclipse.SWT.widgets.shell;
public class OiSwt {
public static void main(String[]args){
Display display = new Display();
Shell.shell =new Shell (display, SWT.DIALOG_TRIM);
shell.setText(“Oi do SWT”);
shell.setLayout (new RowLayout());
Label msg = newLabel(shell, SWT.NULL);
msg.setText(“\nNem parece que fui escrito em Java :-)\n”);
shell.pack();
shell.open();
while (!shell, isDisposed()) {
if(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}
Figura 2. Aplicação mínima em Linux e Windows
Figura 3. Editor visual VE para aplicações SWT
Componentes |
Tamanho total do download (versão 3.1.1) |
Facilidades para desenvolvimento SWT |
Plataforma + JDT |
37Mb |
. Nenhum, fora os fornecidos pelo JDT para aplicações não-SWT |
Plataforma + JDT+PDE |
42 Mb |
. Executar aplicação SWT . Definição da variável de classpath para referenciar bibliotecas inclusas no próprio Eclipse . Javadocs do SWT (dentro da documentação da Eclipse API) |
Eclipse SDK |
45Mb |
. As mesmas facilidades da Plataforma + JDT + PDE, mas inclui os fontes do Workbech, do SWT e de plug-ins |
Plataforma + JDT + PDE + GEF + EMF + VE |
53 Mb |
. Assistentes para criação de aplicações SWT e edição visual destas aplicações |
Configuração do Eclipse 2.x13.0.x
Em versões até a 3.0, a SWT pode ser encontrado dentro do plug-in org.eclipse. swt.<plataforma> _ <versão>, por exemplo org.eclipse.swt.win32_3.0.2 no Windows, ou org.eclipse.swt.gtk_3.0.2 no Linux. Dentro deste plug-in, a pasta ws/<plataforma>, por exemplo ws/win32 (ou ws/gtk), fornece um ou mais pacotes jar contendo as classes do SWT. Todos devem ser inseridos como jars externos no classpath do projeto, como ilustra a Figura 4.
Se você tem o PDE instalado, pode usar a variável ECLIPSE_HOME e assim fazer uma referência relativa aos jars do SWT. Se vários desenvolvedores trabalham no mesmo projeto, o uso de uma variável permite que cada um tenha o Eclipse instalado numa pasta diferente, e que mesmo assim os metadados do projeto (arquivos .project e .classpath) sejam compartilhados via CVS. Para usar essa variável, abra as propriedades do projeto e dentro da aba Libraries da categoria, clique em. Então selecione Add Variable a variável e clique no botão Expand para selecionar os pacotes do SWT dentro da sua instalação do Eclipse (veja a Figura 5).
Se neste ponto o leitor tentar executar a aplicação, verá um erro como:
Exception in thread “main” java.lang. UnsatisfieldLinkEror:
no swt-pi-gtk-3064 in java .library.path
Isso acontece porque ainda é necessário indicar para a JVM onde localizar as bibliotecas nativas do SWT. Precisamos alterar as configurações de execução: use o comando Run |Run para abrir a configuração criada pelo Eclipse para nosso exemplo OiSwt e selecione a aba Arguments. Depois, na caixa VM Arguments forneça o caminho para as bibliotecas nativas do SWT. Este caminho está no mesmo plug-in onde buscamos os pacotes jar, só que na pasta os/<so>/<arquitetura>, por exemplo os/win32/x86 ou os/linux/x86 (veja um exemplo na " [...] continue lendo...