Anda di halaman 1dari 14

SWING

Na era da Web, quase passa desapercebido a importncia das aplicaes Desktop e sua enorme variedade de aplicativos para diversos sistemas operacionais. O desafio e construir aplicaes Desktop que possam ser executadas nestes diversos sistemas operacionais, sem que tenhamos que reescrever o sistema. No Portal Java(http://www.portaljava.com), em pesquisa on-line aparece um resultado que sinaliza a importncia as aplicaes Desktop.

Vou introduzir os conceitos de Java Swing, que constitui um importante conjunto de API's para construo de robustas Interfaces Grficas com o Usurios. JFC e Swing Quando a linguagem Java 1.0 foi lanada, ela continha uma biblioteca de classes que a SUN chamou de AWT(Abstract Window Tool-kit ferramentas de janela abstratas) para programao GUI bsica. A Netscape em 1996 criou uma biblioteca GUI chamada de IFC-Internet Foudation Classes. A SUN trabalhou junto com a Netscape para aperfeioar e criou uma biblioteca de interface de usurio com o nome cdigo de Swing, que alguns chamaram de conjunto Swing. JFC abreviatura de Java Foundation Classes, que abrangem um grupo das caractersticas para construir Interfaces Grficas com o Usurios (GUIs) e adio de ricas funcionalidades e interatividade com aplicaes Java. Swing um kit de ferramentas GUI e faz parte da JFC. Swing no um substituto completo do AWT, simplesmente fornece interface de usurio componentes mais capazes Galeria de componentes Swing:

JApplet

Borders

JButton

JCheckBox

JCheckBoxMenuItem

JColorChooser

JComboBox

ImageIcon

JDialog

JFileChooser

JInternalFrame

JLabel

JList

JMenu JMenuBar

JOptionPane

JPopupMenu

JRadioButton

JRadioButtonMenuItem

JScrollBar

JScrollPane

JSlider

JSplitPane

JTabbedPane

JTable

JTextArea

JTextField

JToggleButton

JToolBar

JToolTip

JTree

API Swing
A API Swing poderosa, flexvel e imensa, que possui pacotes pblicos, cada um com sua prpria finalidade distinta: javax.swing Pacote swing de alto nvel, consiste primariamente de componentes, adaptadores, modelos padro de componentes e interface. javax.swing.border O pacote border declara a interface Border e classes, que define especifico estilo de borda. javax.swing.colorchooser O pacote colorchooser contem suporte de para classes para componentes color chooser . javax.swing.event O pacote de event para eventos e listeners especficos Swing. Adiciona ao java.awt.event types, componentes Swing podem gerar seus prprios tipos de eventos. javax.swing.filechooser O pacote filechooser contem classes de suporte para componentes de seleo de arquivos. javax.swing.plaf Plug-in look-and-feel (PLAF) pacote que contm Interfaces com usurio(UI) classes (delegadas) que implementam diferentes look-and-feel aspects para componentes Swing. H tambm alguns pacotes de PLAF sob a hierarquia. javax.swing.table O pacote table contem suporte para interfaces e e classes para o componente Swing table. javax.swing.text O pacote text contem classes de suporte para o framework do Swing de documento. javax.swing.text.html

O pacote text.html contem classes de suporte para HTML verso 3.2 interpretador e analisador. javax.swing.text.rtf O pacote text.rtf contem classes de suporte para um bsico interpretados Rich Text Format (RTF). javax.swing.tree O pacote tree contem interface e classes para o componente tree do Swing. javax.swing.undo O pacote undo prov classes de suporte para implementar a capacidade de fazer/desfazer nos GUI. javax.accessibility O pacote de acessibilidade da JFC incluido nas classes Swing. Entretanto, seu uso no ser discutido aqui.

Componentes Swing
O widget um termo sem traduo que designa componentes de interface grfica com o usurio (GUI). Qualquer item de uma interface grfica chamada de widget, por exemplo: janelas, botes, menus tens de menus, cones, barras de rolagem, etc. O pacote de acessibilidade da JFC includo nas classes Swing. Entretanto, seu uso no ser discutido aqui.

Hierarquia de componentes similares ao AWT

Hierarquia de componentes novos no Swing

Usando componentes Swing na construo de interfaces com o usurio.


O exemplo AloMundo Swing, foi criado uma interface com o usurio usando componentes do pacote javax.swing.

Cdigo:
import javax.swing.*; public class AloMundoSwing { /** * Cria um GUI e o exibe. Para thread safety, * este metodo podera invocar para uma thread * de disparo de evento(event -dispatching thread). */ private static void criaExibeGUI () { //Faz com que tenha uma decoracao de janela JFrame.setDefaultLookAndFeelDecorated (true); //Cria e organiza a janela JFrame frame = new JFrame("AloMundoSwing" ); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

//Adiciona o rotulo "Alo Mundo". JLabel label = new JLabel("Alo Mundo" ); frame.getContentPane ().add(label); //Exibe a janela frame.pack(); frame.setVisible (true); } public static void main(String[] args) { //Agenda um trabalho para o event -dispatching thread: //cria e exibe uma aplicacao GUI. javax.swing.SwingUtilities. invokeLater (new Runnable() { public void run() { criaExibeGUI (); } }); } }

Resultado:

Este um simple exemplos de aplicao Swing que pode ser escrito. No cdigo do programa Swing temos: 1. Importar os pacotes pertinentes: 2. Posicionando o container top-level. 3. Exibio do container. 4. Thread-safe. import java.awt.*; import java.awt.event.*; Estes dois pacotes so requeridos por que os componentes Swing usam a infraestrutura AWT, incluindo o modelo de eventos. O modelo de eventos governa como um componente reage a um evento semelhante a um clique de boto ou o movimento de mouse. Para fazer o programa fechar, quando o boto Close [x] clicado, inclumos o cdigo: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); O exemplo AloMundoSwing tem um nico container top-level, um JFrame. Implementando uma instncia da classe Jframe, um frame uma janela, por padro, tem ornamentos semelhantes a bordas, ttulos, botes com cones para fechar a janela. Aplicaes tipicamente GUI usam um frame no mnimo. O cdigo a seguir, mostra como um frame construdo e exibido: JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("HelloWorldSwing"); ... frame.pack(); frame.setVisible(true); A exceo dos containes top-level, semelhantes a um Jframe, todos os componentes

descendentes da classe JComponent. HelloWorldSwing usa um JComponent descendente chamado JLabel, que exibe um texto Hello World. As duas prximas linhas de cdigo, constri e adiciona um componente JLabel num frame: JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); Pode parecer estranho, mas recomendado utilizar o cdigo a seguir para que as aplicaes GUI no tenham problemas de threassafety que podem parar a interface antes de aparecer a exibio. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { /* cria e exibe o GUI */ } }); Look e Feel Swing permite que seja especificado um look and feel para os usurios do programas--Java, GTK+, Windows, e assim por diante. Cdigo
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicacaoSwing implements ActionListener { private static String labelPrefix = "Numero de cliques de botao: " ; private int numClicks = 0; final JLabel label = new JLabel(labelPrefix + "0 "); //Especifica o look and feel para usar. Valores validos: //null (usa o padrao), "Metal", "System", "Motif", "GTK+" final static String LOOKANDFEEL = "System"; public Component createComponents () { JButton button = new JButton("Eu sou um botao Swing!" ); button.setMnemonic (KeyEvent.VK_I); button.addActionListener (this); label.setLabelFor (button); /* * Um facil caminho para colocar um espaco entre o container top -level * que contem e para colocar JPanel contido * tem uma borda vazia (empty). */ JPanel pane = new JPanel(new GridLayout (0, 1)); pane.add(button); pane.add(label); pane.setBorder (BorderFactory. createEmptyBorder ( 30, //top 30, //left 10, //bottom 30) //right ); return pane; } public void actionPerformed (ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); }

private static void initLookAndFeel () { String lookAndFeel = null; if (LOOKANDFEEL != null) { if (LOOKANDFEEL. equals("Metal")) { lookAndFeel = UIManager. getCrossPlatformLookAndFeelClassName (); } else if (LOOKANDFEEL. equals("System")) { lookAndFeel = UIManager. getSystemLookAndFeelClassName (); } else if (LOOKANDFEEL. equals("Motif")) { lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel" ; } else if (LOOKANDFEEL. equals("GTK+")) { //novo a partir da versao 1.4.2 lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" ; } else { System.err. println("Valor inesperado de especifico LOOKANDFEEL: " + LOOKANDFEEL); lookAndFeel = UIManager. getCrossPlatformLookAndFeelClassName (); } try { UIManager. setLookAndFeel (lookAndFeel); } catch (ClassNotFoundException e) { System.err. println("Nao pode encontrar classe especifica para o look and feel:" + lookAndFeel); System.err. println("Voce inc luiu a biblioteca L&F library no class path?"); System.err. println("Usa o padrao look and feel." ); } catch (UnsupportedLookAndFeelException e) { System.err. println("Nao pode ser especificado um look and feel (" + lookAndFeel + ") nesta plataforma." ); System.err. println("Uso do padrao look and feel." ); } catch (Exception e) { System.err. println("Nao pode obter especifico look and feel (" + lookAndFeel + "), por alguma razao ." ); System.err. println("Uso do padrao look and feel." ); e.printStackTrace (); } } } /** * Cria um GUI e o exibe. Para thread safety, * este metodo podera invocar para uma thread * de disparo de evento(event -dispatching thread). */ private static void criaExibeGUI () { //Inicializa o look and feel. initLookAndFeel (); //Faz com se tenha janelas com decoracoes agradaveis. JFrame.setDefaultLookAndFeelDecorated (true); //Cria e organiza janela. JFrame frame = new JFrame("AplicacaoSwing" ); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); AplicacaoSwing app = new AplicacaoSwing (); Component contents = app. createComponents ();

frame.getContentPane ().add(contents, BorderLayout.CENTER); //Exibe a janela. frame.pack(); frame.setVisible (true); } public static void main(String[] args) { //Agenda um trabalho para o event -dispatching thread: //cria e exibe uma aplicacao GUI. javax.swing.SwingUtilities. invokeLater (new Runnable() { public void run() { criaExibeGUI (); } }); } }

Resultado:

A parte de cdigo a seguir, mostra como AplicacaoSwing especifica de que maneira deve ser usado o Java look and feel: String lookAndFeel = null; ... lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName(); ... try { UIManager.setLookAndFeel(lookAndFeel); } catch (Exception e) { } ...// Cria e exibe um GUI...

Construo de Botes e Rtulos.


Como a maioria dos GUIs, a AplicacaoSwing GUI contem um boto e um rtulo(label). O cdigo a seguir, inicializa o boto: JButton button = new Jbutton("Eu sou um botao Swing!"); button.setMnemonic('i'); button.addActionListener(/*...cria um action listener...*/); A primeira linha cria o boto. A segunda marca a letra "i" um mnemnico para o usurio poder usar e simular um clique do boto. Por exemplo, no Java look and feel, tipicamente a tecla Alt-i que faz isto. A terceira linha registra para fornecer o evento (event handler) para o clique do boto. Onde as variveis so declaradas e inicializadas os rotulos. private static String labelPrefix = "Numero de cliques de botao: "; private int numClicks = 0;

Cdigo de inicializao do GUI final JLabel label = new JLabel(labelPrefix + "0 label.setLabelFor(button); label.setText(labelPrefix + numClicks);

");

Adicionando um Componente ao Container


O programa AplicacaoSwing, agrupa o label e o boto no container (um JPanel) antes de adicionar o componente no frame. A seguir o cdigo de inicializao do container: Cdigo: Resultado: A primeira linha cria um container e atribui um gerenciador de layout- no objeto determina o tamanho e posio de cada componente e adiciona para o container. O cdigo new GridLayout(0,1) cria um gerenciador de layout que fora o contedo do container's ser exibido numa unica coluna, com cada componente que tem o mesmo tamanho. JPanel pane = new JPanel(new GridLayout(0, 1)); pane.add(button); pane.add(label); pane.setBorder(BorderFactory.createEmptyBorder(...); Nestas duas linhas adiciona o boto e label no container. A ltima linha adiciona uma borda. Para adio de bordas ao painel, o cdigo cria e ajusta uma borda que fornea algum espao vazio em torno do container - 30 pixels extras no top, e 10 pixels extras a esquerda( left), direita(right) no rodap (bottom).

Adicionando bordas ao Redor dos Componentes Cdigo: Resultado:


30, //top 30, //left 10, //bottom 30) //right); O cdigo adiciona uma borda. Para adio de bordas ao painel, o cdigo cria e ajusta uma borda que fornea algum espao vazio em torno do container - 30 pixels extras no top, e 10 pixels extras a esquerda( left), direita(right) no rodap (bottom). Bordas tem caractersticas herdadas do JPanel da classe Jcomponent. Um objeto Border no um JComponent; isto , usa um ou mais JComponents para pintar o componente borda. pane.setBorder(BorderFactory.createEmptyBorder(

Handling Events
Cada vez que o usurio digita um carter ou aperta um boto do mouse, um evento ocorre. Todo o objeto pode ser notificado do evento. Todo o objeto tem que implementar apropriadamente a interface e registra um event listener na apropriada fonte do evento.

A classe AplicacaoSwing implementa um event handler para o clique do boto(action events). Observe o cdigo a seguir: public class AplicacaoSwing implements ActionListener { ... JButton button = new Jbutton("Eu sou um botao Swing!"); button.addActionListener(this); .... public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } } Cada event handler requer trs partes no cdigo: 1. Na declarao para a classe event handler, uma linha de cdigo especifica na classe a implementao da interface listener ou extende a classe que implementa a interface listener. Por exemplo: public class MinhaClasse implements ActionListener { Em geral, para detectar os cliques do boto do usurio na tela(ou equivalente no teclado), um programa tem que ter um objeto que implemente a interface ActionListener . O programa pode registrar que o objeto no action listener no boto (a fonte do evento), usa o mtodo addActionListener. Onde o usurio clicar com boto na tela que dispara o evento. Este resultado na invocao do action listener's do mtodo actionPerformed(o nico mtodo na interface ctionListener). O simples argumento para o mtodo no objeto ActionEvent que d sobre o evento e na fonte do evento. Os componentes Swing podem gerar muitos tipos de eventos. Alguns eventos e suas associado no Event Listeners: Ao do resultado do evento Tipo Listener Clique do usurio no boto, pressiona Enter quando um campo de texto, ActionListener ou item menu de seleo Usurio fecha um frame(janela principal) Usurio preciona um boto do mouse quando o cursor passa sobre um componente Usurio move o mouse sobre um componente. O componente torna-se visvel O componente recebe o foco do teclado Mudana de seleo na tabela ou lista Variao de uma propriedade no componente semelhante a um texto no label. WindowListener MouseListener MouseMotionListener ComponentListener FocusListener ListSelectionListener PropertyChangeListener

Bibliografia: http://javanoroeste.com.br/