API Swing Java André Scarmagnani1 , Matheus Madalozzo1 , Miguel Diogenes Matrakas1 1 UDC ANGLO – Faculdade Anglo Americano (FAA) Av. Paraná, 5661, CEP: 85868-030 – Foz do Iguaçu – PR – Brasil [email protected], [email protected] [email protected] Abstract. The API Swing is a widget toolkit for Java has its designated use. Works in a different way from the Abstract Window Toolkit (AWT), but is compatible with it. The Swing aims to render the components on their own, rather than delegate this function to the operating system, a common practice among other graphical interface APIs. Resumo. A API do Swing é um widget toolkit que possui seu uso designado para Java. Trabalha de uma maneira distinta do Abstract Window Toolkit (AWT), porém, é compátivel com o mesmo. O Swing tem como objetivo renderizar por conta própria os componentes, ao invés de delegar esta função ao sistema operacional, prática comum entre outras APIs de interface gráfica. 1. Introdução De acordo com [Jandl 2007], uma aplicação gráfica é executada dentro de um ambiente gráfico disponibilizado por diversos sistemas operacionais. A Graphical User Interface (GUI) permite que os usuários trabalhem em uma interface padronizada de uma forma mais simples e intuitiva. Uma GUI pode fornecer diferentes aparências para um sistema operacional, como o Mac OS, Microsoft Windows XP, Sun Solaris e outros gerenciadores de interfaces baseados no X-Window System (MIT) incorporados por sistemas Unix. Uma vantagem presente na linguagem Java, é que a mesma oferece capacidades únicas no desenvolvimento de aplicações gráficas que, sem modificação ou recompilação, podem ser executadas em diferentes ambientes gráficos. 2. Objetivos A proposta do artigo consiste em fornecer um breve entendimento quanto ao funcionamento de alguns componentes do Swing, bem como explicar o que originou o seu aparecimento através de uma breve comparação com a toolkit AWT. Será abordado ainda algumas das classes mais vistas no Swing, no intuito de disponibilizar uma simples implementação das mesmas. 3. Surgimento do Swing O propósito do pacote Swing é de superar algumas limitações do pacote AWT, por exemplo, o AWT utilizava rotinas do sistema operacional para manter seus componentes, entretanto, nem todos componentes estavam disponíveis em todas as plataformas. No objetivo de amenizar a situação, a Sun Microsystems incluiu no toolkit apenas componentes básicos, ignorando tabelas, árvores e etc, o que resultou em outros problemas, pois para aplicações mais complexas a solução era implementar componentes próprios devido aos poucos que eram disponibilizados na AWT. A partir da versão do Java 1.2, a Sun incluiu o pacote Swing como evolução do pacote AWT. No Swing foram incluídos componentes próprios que não dependiam de rotinas do sistema operacional, além de oferecer uma interface gráfica mais evoluida e com maiores efeitos. Ao contrário do AWT, o Swing emula seus próprios componentes (lightweight), sendo assim, a renderização dos componentes é feita pelo java. O Swing também supriu as incompatibilidades, possibilitando utilizar os mesmos componentes do AWT em qualquer plataforma, independente das possíveis implementações nativas do sistema operacional. A família de componentes Swing possui as seguintes características: • Componentes Swing: São uma nova geração de componentes com vasta capacidade de configurações e funcionalidades. • Suporte para múltiplos Pluggable Look and Feel: Possibilita que aplicações Java utilizarem diferentes aparências visuais que podem ou não serem adaptadas ao ambiente de execução utilizado. • Acessibilidade: Possibilita o uso integrado de tecnologias para auxílio de portadores de necessidades especiais através de monitores e teclados adaptados. • Java 2D: É um pacote de classes para desenho 2D de gráficos, texto e imagens de alta qualidade. • Drag and Drop: Este tipo de suporte consiste na capacidade de arrastar e soltar componentes entre aplicações Java e aplicações nativas. 4. Componentes Swing A figura (1) deixa visível que os componentes Swing possuem o prefixo J em seus nomes, diferenciando-os dos componentes AWT. A classe JComponent representa as características comuns de todos os componentes, ou seja, de todos aqueles objetos que possuem uma representação gráfica, que podem interagir com o usuário e que possuem uma aparência e comportamento. Figura 1. Estrutura dos componentes Swing. Imagem adaptada [Jandl 2007] A SMA (Separable Model Architecture) é a estrutura interna dos componentes Swing, semelhante ao padrão MVC (Model-View-Controller). As funcionalidades de um componente do MVC são divididas da seguinte forma: Model – administra dados associados ao componenente; View – é responsável pela visualização e aparência do componente; Controller – gerencia o funcionamento e visualização do componente que integram uma camada de código separada do modelo utilizado para armazenar seus dados. Todavia, no SMA a funcionalidade e visualização dos componentes integram uma camada de código separada do modelo utilizado para armazenar seus dados. Existe uma camada responsável pela visualização e funcionalidade dos componentes, cuja função é permitir que os componentes exibam uma apresentação diferente em cada plataforma, possibilitando algumas personalizações inclusive na forma de controle dos componentes. Esta camada é vinculada à JVM (Java Virtual Machine) e é conhecida como Puggable Look and Feel (PL&F). Tabela 1. Principais componentes Swing. Tabela adaptada [Jandl 2007] JApplet, applet JButton, botão JCheckBox, caixa de opção JCheckBoxMenuItem, opção do menu JColorChooser, diálogo para seleção de cores JCombo, caixa de seleção JDesktopPane, janela base para MDI1 JDialog, janela de diálogo JFileChooser, diálogo para seleção de arquivos JFrame, janela completa JInternalFrame, janela interna para MDI JLabel, rótulo de texto JList, caixa de lista JMenu, menu pull down JMenuBar, barra de menus JMenuItem, item de menu JOptionPane, diálogo configurável JPanel, painel JPasswordField, caixa de entrada de senhas JPopupMenu, menu pop-up JProgressBar, barra de progresso JRadioButton, botão de opção JScrollBar, barra de rolagem JScrollPane, painel deslocável JSeparator, separador JSlider, controle deslizante JSpliPane, painel de divisão ajustável JTabbedPane, painel com abas JTable, tabela JTextArea, área de texto JTextField, caixa de entrada de texto JTextPane, área de texto com atributos JToggleButton, botão para conjunto JToolBar, barra de ferramentas JTree, árvore JWindow, janela simples Alguns dos componentes citados na tabela (1), precisam ser agrupados para obtenção de funcionalidades específicas, por exemplo, o JTextArea combinado com um JScrollPane terá suas funcionalidades de rolagem habilitadas.1 [OracleTM 2013] 4.1. JFrame A classe JFrame é responsável por desenhar uma tela e tratar eventos na mesma, ou seja, a classe representa uma janela. O trecho de código abaixo mostra um JFrame simples: 1 2 3 4 5 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SnippetFrame extends JFrame{ // Construtor do Frame. 1 MDI = Multiple Document Interface public SnippetFrame(){ super(); // adiciona um componente getContentPane().add(new JLabel ("Teste")); // Seta a cor do background para branco. getContentPane().setBackground(Color.white); // Manda o Java calcular o melhor tamanho para o frame. pack(); //Adiciona um evento para fechar a aplicacao addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent evt){ System.exit(0); } }); setVisible(true); 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 } public static void main(String[] args) { new SnippetFrame(); } 21 22 23 24 25 } A figura (2) mostra graficamente as camadas que formam um JFrame: Figura 2. Estrutura de um JFrame. Imagem adaptada [Jandl 2007] Técnicamente, pode-se dizer que o ContentPane é o elemento principal pois trata-se da janela onde é exibido a aplicação (JPanel), ou seja, é nele que serão adicionados os demais componentes para a janela, gerenciando seu layout e demais características. O acesso ao componente ocorre da seguinte forma: Container conteudo = getContentPane();. Para adicionar outros componentes tem-se a forma: conteudo.add(componente);. A classe JFrame é derivada do pacote java.awt e compartilha os demais métodos das superclasses Window e Frame. [Jandl 2007] 4.2. JDialog Em [Deitel and Harvey 2009], afirma-se que o uso desta classe implementa a base para construção de janelas de diálogo, é derivada de Dialog(java.awt) e identica a JFrame, ou seja, ambas possuem a estrutura interna de forma análoga, podendo conter vários componentes em seu painel de conteúdo. É importante destacar que com a classe Dialog é possível criar uma janela que quando exibida, bloqueia o uso das demais janelas da mesma aplicação, com exceção das janelas criadas sob sua responsabilidade, esta prática é conhecida como janela modal. Quando um diálogo modal é oculto através do setVisible(false) ou fechado, dispose(), sua janela responsável deixa de ser bloqueada, podendo ser novamente utilizada. Portanto, a ação default de fechamento de um diálogo é HIDE_ON_CLOSE, e as demais ações idênticas àquelas possíveis para um JFrame. O exemplo (1) contém a estrutura de um diálogo simples com o uso da ação de fechamento HIDE_ON_CLOSE. Exemplo (1) – Classe SwingDialog 1 2 3 4 5 6 7 8 9 import java.awt.*; import javax.swing.*; public class SwingDialog extends JDialog{ public SwingDialog(Frame prop, boolean modal){ super(prop, "Swing Dialog", modal); setBounds(300, 50, 200, 100); add(new JLabel("Dialogo")); } } 4.3. JWindow JWindow é um container que pode ser exibido em qualquer lugar da área de trabalho do usuário, mas não possuindo alguns componentes como barra de título, bordas, menus e demais controles típicos das janelas JFrame ou JDialog. É interessante utilizar este container quando a decoração e controle das janelas não são convenientes para a aplicação, como em elementos de informação flutuante (dicas de ferramentas, ajuda e opções de autopreenchimento). 5. Componentes pesados Alguns componentes Swing não estão amarrados em componentes GUI reais da plataforma subjacente, ou seja, são denominados como componentes leves. Distintamente, os componentes AWT estão vinculados à plataforma local e, por sua vez, são conhecidos como componentes de peso pesado devido a dependência do sistema de janela da plataforma local, responsável por determinar sua funcionalidade, aparência e comportamento. Os componentes Swing GUI pesados e os AWT, requerem interação direta com o sistema de janela local, que restringe sua aparência e funcionalidade, tornando-os menos flexíveis do que os componentes leves. Em [Deitel and Harvey 2009], destaca-se que a aparência e comportamento de uma GUI definida com os componentes de GUI peso pesado do pacote java.awt podem variar de uma plataforma para outra. Como os componentes pesados estão vinculados à GUI da plataforma local, a aparência e comportamento variam de plataforma para plataforma. 6. Conclusão Embasado nos estudos realizados sobre a API Swing, nota-se que o Swing é uma API de alto nível e, consequentemente, possui maior abstração e menor aproximação das APIs do sistema operacional. Um aspecto positivo, é que a API Swing é mais completa e independente do sistema operacional utilizado, as aplicações desenvolvidas com o Swing possuem interfaces semelhantes. Tendo em vista os componentes Swing destacados neste artigo, percebe-se uma praticidade na implementação dos mesmos, permitindo que muitos sejam combinados para trazer diferentes possibilidades de resultados esperados. Entende-se que o Swing foi inserido como resposta aos inconvenientes causados pelo uso do AWT. Conforme destacado no artigo, o Swing traz seus componentes renderizados no próprio java, desta forma, problemas de incompatibilidade entre plataformas foram supridos, assim como outros problemas que impossibilitavam que o AWT mantivesse. Referências Deitel, P. and Harvey, D. (2009). Java: como programar. Pearson Prentice Hall, 8th edition. Jandl, P. J. (2007). Java: Guia do Programador. Novatec Editora Ltda, 1th edition. OracleTM (2013). The java tutorials: Using swing component. http://docs.oracle.com/javase/tutorial/uiswing/components/. Acessado em: 23 maio de 2014.