Você está na página 1de 85

UNIVERSIDADE FEDERAL DE SANTA CATARINA PROGRAMA DE EDUCACAO TUTORIAL CIENCIAS DA COMPUTACAO

Componentes da Interface Grafica da Linguagem Java


Wanderson Rigo

Verso 1.1 a Florianpolis, Outubro de 2004 o

Esta verso inicial pode conter erros que passaram despercebidos ao jula gamento do autor. Assim sendo, o mesmo pede que lhe sejam reportadas as falhas que por ventura o leitor encontre. Qualquer dvida ou sugesto u a deve ser encaminhada por e-mail para pet@inf.ufsc.br ou para o autor. A verso atualizada deste documento deve estar dispon a veis no endereo c http://monica.inf.ufsc.br.

Este documento pode ser distribu livremente em sua forma original. do Partes deste documento podem ser usadas em outros documentos, desde que exista indicao de fonte e instrues para obteno do documento completo. ca co ca O cdigo bsico aqui apresentado pode ser usado para facilitar a estruturao o a ca das futuras aplicaes do leitor. co

A Este documento foi constru e formatado com L TEX 2 do

Sumrio a
Prefcio a Consideraes Gerais co 1 Introduo ` Concepo de Interfaces Grcas ca a ca a 1.1 Analogia Recorrente . . . . . . . . . . . . . . . . . . . . . . . 5 6 7 7

2 Criao de Interfaces Grcas ca a 9 2.1 Componentes Swing . . . . . . . . . . . . . . . . . . . . . . . 9 2.2 Componentes A.W.T. . . . . . . . . . . . . . . . . . . . . . . 10 2.3 Hierarquia das Classes dos Componentes . . . . . . . . . . . . 11 3 Bases de Estruturao das ca 3.1 Conteiners . . . . . . . . 3.1.1 JFrame . . . . . 3.1.2 JDialog . . . . . 3.1.3 JApplet . . . . . 3.2 Painis . . . . . . . . . . e 3.3 Gerenciadores de Leiaute 3.3.1 FlowLayout . . . 3.3.2 BorderLayout . . 3.3.3 GridLayout . . . 3.3.4 BoxLayout . . . . 3.3.5 CardLayout . . . 3.3.6 GridBagLayout . 4 Componentes Atmicos o 4.1 JLabel . . . . . . . . . 4.2 Botes . . . . . . . . . o 4.2.1 JButton . . . . 4.2.2 JCheckBox . . 4.2.3 JRadioButton . 4.3 JTextField . . . . . . . 4.4 JPasswordField . . . . 4.5 JTextArea . . . . . . 4.6 JScrollPane . . . . . . 4.7 JSlider . . . . . . . . . 4.8 JComboBox . . . . . . 4.9 JList . . . . . . . . . . 4.10 JPopupMenus . . . . . Interfaces Grcas a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 15 19 23 24 24 25 27 28 28 31 33 38 38 41 41 44 45 48 50 50 53 54 56 58 62

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . . 2

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

4.11 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5 Eventos 5.1 Tratamento de Eventos . . . . . . . . . . . . 5.1.1 A Origem do Evento . . . . . . . . . . 5.1.2 O Objeto Evento . . . . . . . . . . . . 5.1.3 Ouvinte do Evento . . . . . . . . . . . 5.2 Tratadores de Eventos ou Ouvintes (Listeners) 5.2.1 ActionListener . . . . . . . . . . . . . 5.2.2 FocusListener . . . . . . . . . . . . . . 5.2.3 ItemListener . . . . . . . . . . . . . . . 5.2.4 KeyListener . . . . . . . . . . . . . . . 5.2.5 MouseListener . . . . . . . . . . . . . . 5.2.6 MouseMotionListener . . . . . . . . . . 5.2.7 WindowListener . . . . . . . . . . . . . 5.3 Classes Adaptadoras . . . . . . . . . . . . . . 5.4 Classes Internas Annimas . . . . . . . . . . . o 5.5 Como implementar um Tratador de Eventos . Consideraes Finais co Referncias Bibliogrcas e a 72 72 72 72 72 73 73 73 73 74 76 76 79 80 80 81 83 84

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

Lista de Figuras
1.1 2.1 2.2 Apresentao de alguns Componentes GUI . . . . . . . . . . . ca 8

Aparncia de metal (comum em todas as plataformas) . . . . . 9 e Aparncia personalizada com o estilo do Motif . . . . . . . . . 10 e 19 25 28 29 31 34 39 42 44 46 48 51 54 56 59 63 66

3.1 Interface do exemplo que usa JDesktopPane e JInternalFrame 3.2 Interface do exemplo que usa FlowLayout . . . . . . . . . . . . 3.3 Interface do exemplo que usa BorderLayout para gerenciar a Ultima Carta. . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Interface do exemplo que usa BoxLayout . . . . . . . . . . . . 3.5 Interface do exemplo que usa CardLayout . . . . . . . . . . . 3.6 Interface do exemplo que usa GridBagLayout . . . . . . . . . . 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 5.1 5.2 Interface Interface Interface Interface Interface Interface Interface Interface Interface Interface Interface do do do do do do do do do do do exemplo exemplo exemplo exemplo exemplo exemplo exemplo exemplo exemplo exemplo exemplo que que que que que que que que que que que usa usa usa usa usa usa usa usa usa usa usa JLabel . . . . JButton . . . JCheckBox . . JRadioButton JTextField . . JTextArea . . JSlider . . . . JComboBox . JList . . . . . JPopupMenu . JMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Interface do exemplo que demonstra as Atividades do Teclado 74 Interface do exemplo que demonstra as Atividades do Mouse . 77

Prefcio a
Este material destina-se a usurios da linguagem Java que pretendem a incluir interfaces grcas em suas aplicaes, sejam elas autnomas ou apa co o plets. Salientamos que de grande valia ao usurio j estar familiarizado e a a com a Linguagem Java, pois o contedo desse material no explana conceiu a tos bsicos nem discute a sintaxe da Linguagem. Aconselhamos o leitor, caso a julgar necessrio, a buscar uma base no material Introduo ` Linguagem a ca a Java, sitiado em http://monica.inf.ufsc.br. Centralizaremos nossos esforos de forma ` transmitir de maneira prtica c a a e sucinta o contedo, de modo que o leitor possa aprender e aplicar os tpicos u o abordados. Assim sendo, aps apresentarmos uma breve explicao de cada o ca componente (botes, janelas, barras de rolagem, etc...) usado para comporo mos nossas Interfaces, o leitor ser convidado a aprofundar seus conhecimena tos nos exemplos. Cap tulo 1 traz uma breve introduo do que e para que servem as Interca e faces Grcas. Tambm d bases ao entendimento por parte do leigo a e a usando uma analogia de fcil compreenso. a a Cap tulo 2 apresenta a hierarquia das classes e pacotes em que o assunto propriamente dito se estrutura. Aqui tambm diferencia-se os compoe nentes em dois hemisfrios: Swing e A.W.T.. e Cap tulo 3 apresenta os componentes onde toda a Interface Grca deve a estar galgada, as caracter sticas de cada um, bem como alguns mtodos e e constantes para o gerenciamento e distribuio de outros elementos ca sobre os prprios componentes. o Cap tulo 4 neste cap tulo explicitamos os componentes que estamos mais habituados a utilizar, pois, de algum modo, realizam ou disparam funes corriqueiras ` qualquer programa. co a Cap tulo 5 mostra os tpicos relacionados aos eventos disparados por muio tos dos componentes j vistos nos cap a tulos precedentes. Tambm apree sentamos mtodos para gerir e tratar os eventos. e Aps esta breve descrio dos tpicos que sero explicitados, sinta-se ` o ca o a a vontade para explorar o contedo da maneira que melhor lhe convier. u Wanderson Rigo wander@inf.ufsc.br Programa de Educao Tutorial - PET/CCO ca pet@inf.ufsc.br 5

Consideraes Gerais co
Ressaltamos que iremos explanar aqui somente alguns mtodos necessrios e a a `s funcionalides dos exemplos, cabendo ao leitor procurar na bibliograa indicada, se julgar necessrio, maior esclarecimento sobre os demais mtodos a e das classes. Cabe ainda lembrar que os exemplos mostrados aqui so voltaa dos ao propsito maior, ou seja, habilitar o leitor a criar interfaces grcas. o a A funcionalidade ou complexidade dos mesmos no discutida pois estes a e exemplos s tm carter ilustrativo e didtico. o e a a E bem sabido que existem programas de desenvolvimento que facilitam a tarefa que aqui propomos elucidar. Alm de propiciarem retorno visual e imediato, eles geram o cdigo automaticamente. Aos olhos do programador o pragmtico, essas virtudes evocam produtividade e facilidade. Porque escoa lher amos o caminho das pedras, que consiste num processo em que temos que pensar, compor nossos cdigos e compilar cada vez que mudamos pequeo nos detalhes? Ora, como programador que se preze, e , com certeza , o leitor h de ser, essa via representa a continuidade do que aprendemos, ou seja, a a implementao direta e sob nosso dom ca nio, mantida sob nossa responsabilidade e competncia. Alm do mais, quem se aventurar pelas linhas dessa e e material, tranquilamente poder explorar os dois caminhos de forma slida a o e concisa. Obviamente aqui no focalizaremos a construo de Interfaces no que a ca toca a sua esttica, mas sim no como fazer. Tambm em nenhum momento e e questionamos a qualidade dos aplicativos de linha de comando, porm, se e s olhssemos o lindo azul do cu, como ir o a e amos ver as demais belezas do planeta? Esperamos que o fasc nio de compor janelas elegantes e funcionais o motivem a extrair o mximo de proveito desse material, pois depois de toda a a evocao e motivao precedente, estamos aptos a iniciar o estudo. ca ca

Cap tulo 1 Introduo ` Concepo de ca a ca Interfaces Grcas a


E notrio a todos ns que muitos dos programas que conhecemos interao o gem com os usurios atravs da troca de informaes. O meio pelo qual a a e co parte humana solicita ao programa a execuo de tarefas, alguma resposta, ca ou qualquer comunicao entre as partes feita pela Interface. Muitas veca e zes confundida com o programa em s a Interface tem peso signicativo , na aceitao do software, j que, com certeza, clientes so atra ca a a dos pela facilidade de manipulao e de aprendizado, telas atraentes e chamativas, ca bem como pelos componentes auto-explicativos. Essas caracter sticas mencionadas so obtidas aliando-se criatividade, bom senso, organizao lgica, a ca o conhecimento tcnico, etc.. e A interface grca com o usurio (GUI - graphical user interface) fora a nece a um programa um conjunto consistente de componentes intuitivos, familiarizando o usurio com as diversas funes e diminuindo o tempo de a co a das a partir de aprendizado da nova ferramenta [1]. As GUIs so constru componetes GUI, que so objetos com o qual o usurio interage atrves dos a a a dispos tivos de entrada, ou seja, o mouse, o teclado, a voz, etc.

1.1

Analogia Recorrente

Antes de iniciarmos o contedo tcnico deste material, vamos compor um u e cenrio familiar ao leitor, de modo que este panorma venha a esclarecer a a losoa de trabalho que utilizaremos logo adiante. Valeremo-nos de uma analogia, que servir de base ao entendimento dos componentes descritos a nesse curso. Imagine que construir interfaces consiste em colar adesivos em uma tela de vidro. Antes de tudo, bvio que devemos possuir uma tela que, como eo veremos, representada pelos conteiners. Tambm dispomos de adesivos e e de diversos tamanhos que podem ser distribu dos e anexados livremente pela superf do vidro. Tais adesivos elementares so os painis. Alm disso, cie a e e dispomos de adesivos mais elaborados que j esto pr-denidos com guras a a e de botes, rtulos, etc. Eles podem ser colados diretamente no vidro, ou o o sobre os outros adesivos rudimentares (painis), tal qual a nossa vontade, e e embora limitando-se ` capacidade do espao f a c sico dispon vel.

Na gura abaixo, a qual ilustra alguns componentes que sero estudados a mais a frente, vemos a concepo real de nossa analogia. ca

Figura 1.1: Apresentao de alguns Componentes GUI ca

Caro leitor, voc h de convir que parece ser uma tarefa demasiadae a mente fcil construirmos interfaces que viabilizem a interao Homem x a ca Mquina. Ento agora, sem maiores delongas, iremos nos embrenhar pelo a a mundo da programao utilizando as classes, pacotes e as interfaces neca cessrias ` soluo de nosso problema. a a ca

Cap tulo 2 Criao de Interfaces Grcas ca a


Em Java, as classes nas quais nos baseamos para criar os componentes, bem como para fornecer-lhes funcionalidade, esto agrupadas em dois grandes a pacotes: java.awt (pacote do ncleo) e javax.swing (pacote de extenso). u a Os dois pacotes denem componentes com peculiaridades distintas e que sero discutidas logo abaixo. a

2.1

Componentes Swing

O pacote javax.swing foi criado em 1997 e inclui os componentes GUI que se tornaram padro em Java a partir da verso 1.2 da plataforma Java a a 2. A maioria dos componentes Swing (assim so denominados) so escria a tos, manipulados e exibidos completamente em Java, sendo conhecidos como componentes Java puros. Isso oferece a eles um maior n vel de portabilidade e exibilidade. Os nomes de tais componentes recebem um J, como, por exemplo: JLabel, JButton, JFrame, JPanel, etc. Tal peculiaridade se justica para diferenciar esses componentes dos que sero mencionados logo a adiante. So considerados peso-leve e fornecem funcionalidade e aparncia a e uniforme em todas as plataforma, sendo denominada de aparncia de metal e (metal look-and-feel).

Figura 2.1: Aparncia de metal (comum em todas as plataformas) e

Entretanto, muitos componentes Swing ainda so considerados peso-pesados. a Em particular, as subclasses de java.awt.Window, como JFrame, utilizada para exibir janelas e as de java.applet.Applet, como JApplet originam componentes que se apoiam no sistema de janelas da plataforma local para determinar sua funcionalidade, aparncia e seu comportamento[1]. e

Figura 2.2: Aparncia personalizada com o estilo do Motif e O Swing tambm fornece exibilidade para personalizar a aparncia e o e e comportamento dos componentes de acordo com o modo particular de cada plataforma, ou mesmo altera-los enquanto o programa est sendo executado. a As opes so a personalizaao com o estilo do Microsoft Windows, do Apple co a c Macintosh ou do Motif (UNIX).

2.2

Componentes A.W.T.

Os componentes GUI oriundos do pacote Abstract Windowing Toolkit (java.awt) tiveram origem na verso 1.0 da plataforma Java 2, e esto dia a retamente associados com os recursos da interface grca da plataforma do a usurio. Dessa forma, a aparncia dos componentes difere quando o proa e grama executado no Microsoft Windows e no Apple Macintosh. Podemos e dizer que estes componentes considerados peso-pesados herdam a aparncia e denida pela plataforma, pois o A.W.T. foi projetado para que cada mquina a virtual Java implemente seu elemento de interface. Isso pode ser desejvel, a uma vez que permite aos usurios do programa utilizar os componentes GUI a com que eles j esto familiarizados, porm o leiaute e o alinhamento dos a a e componentes pode se alterar devido aos tamanhos diferentes dos mesmos em cada plataforma [1]. Se voc executar o exemplo implementado pelo cdigo precedente, ver e o a que a aparncia dos componentes muda, porm a janela, que um objeto da e e e classe JFrame (considerado componente peso-pesado), permanece inaltervel. a Tambm poss notar isso comparando as guras 2.1 e 2.2. e e vel Essa coleo de componentes para construo de Interfaces Grcas est ca ca a a desatualizada e foi substituida pelo projeto Swing [6]. Em virtude disso, nossa nfase reside no estudo e uso do pacote em maior evidncia. e e 10

2.3

Hierarquia das Classes dos Componentes

Mostraremos abaixo a hierarquia de herana das classes que denem atric butos e comportamentos que so comuns a maioria dos componentes Swing. a Cada classe exibida com o seu pacote: e -------------------------| java.lang.Object | -------------------------| -------------------------| java.awt.Component | -------------------------| -------------------------| java.awt.Container | -------------------------| -------------------------| javax.swing.JComponent | -------------------------| -----------------------------------------------| | | | | | -------- ----------- ------- -------- --------- ---------|JLabel| |JComboBox| |JList| |JPanel| |JSlider| |JPopuMenu| -------- ----------- ------- -------- --------- ---------As operaes comuns ` maioria dos componentes GUI, tanto Swing como co a AWT so denidas na classe Component. Isso inclui mtodos relativos ` a e a posicionamento, personalizao, tamanho, visibilidade, pintura, registro de ca tratadores de eventos, ajuste e retorno de estado dos componentes. Em aplicativos com JFrames e em applets, anexamos os elementos ao painel de contedo, que um objeto da classe Container. Logo, a classe u e Container d suporte ` adio e posicionamento dos componentes ao painel a a ca de contedo de um continer. u e A classe JComponent, que dene os atributos e comportamentos para suas subclasses, a superclasse da maioria dos componentes Swing. Com e exceo dos conteiners JFrame e JDialog, todos os demais componentes Swing ca cujo nome comece com J descendem da classe JComponent [2]. Agora mostraremos o cdigo que implementa a funcionalidade de muo dana de aparncia dos componentes, sendo que esta, j foi descrita anteric e a ormente:
1 2 3 4 5 6 7

// Mudando a aparencia da GUI import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteLookAndFeel extends JFrame {

11

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

private private private private private private private private private

String strings[] = { "Metal", "Motif", "Windows" }; UIManager.LookAndFeelInfo aparencia[]; JRadioButton radio[]; ButtonGroup grupo; JButton botao; JLabel rotulo; JComboBox comboBox; JTextField campo; JTextArea texto;

// configura a GUI public TesteLookAndFeel() { super( "Testando a Apar^ncia e Comportamento" ); e Container container = getContentPane(); // configura painel para a regi~o NORTH de BorderLayout a JPanel painelNorte = new JPanel(); painelNorte.setLayout( new GridLayout( 2, 2, 5, 5 )); // configura o rtulo para o painel NORTH o rotulo = new JLabel( "Esta a apar^ncia Metal" ); e e rotulo.setVerticalTextPosition(SwingConstants.CENTER); container.add( rotulo ); // configura o bot~o para o painel NORTH a botao = new JButton( "Eu sou um Bot~o" ); a painelNorte.add( botao ); campo = new JTextField( "Qualquer texto" ); painelNorte.add( campo ); // configura caixa de combina~o para o painel NORTH ca comboBox = new JComboBox( strings ); painelNorte.add( comboBox ); // anexa o painelNorte ` regi~o NORTH do painel de contedo a a u container.add( painelNorte, BorderLayout.NORTH ); // cria array para os bot~es de op~o o ca radio = new JRadioButton[ 3 ]; // configura painel para a regi~o SOUTH de BorderLayout a JPanel painelSul = new JPanel(); painelSul.setLayout( new GridLayout( 1, 3 ) ); // configura bot~es de op~o para o painelSul o ca radio = new JRadioButton[ 3 ]; radio[ 0 ] = new JRadioButton( "Metal" ); radio[ 1 ] = new JRadioButton( "Motif" ); radio[ 2 ] = new JRadioButton( "Windows" ); grupo = new ButtonGroup(); //implementa exclus~o mtua a u TratadorDeItens trat = new TratadorDeItens(); for ( int count = 0; count < radio.length; count++ ) { radio[ count ].addItemListener( trat ); grupo.add( radio[ count ] );

12

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

painelSul.add( radio[ count ] ); } // anexa o painelSul ` regi~o SOUTH do painel de contedo a a u container.add( painelSul, BorderLayout.SOUTH ); // obtm inform~es sobre a apar^ncia e e co e // comportamento instalado aparencia = UIManager.getInstalledLookAndFeels(); setSize( 400, 300 ); setVisible( true ); radio[ 0 ].setSelected( true ); } // usa UIManager para mudar a apar^ncia e comportamento da GUI e private void mudeTheLookAndFeel( int valor ) { // muda apar^ncia e comportamento e try { UIManager.setLookAndFeel( aparencia[ valor ].getClassName() ); SwingUtilities.updateComponentTreeUI( this ); } // processa problemas com a mudana da apar^ncia e c e // do comportamento catch ( Exception exception ) { exception.printStackTrace(); } } // executa a aplica~o ca public static void main( String args[] ) { TesteLookAndFeel aplicacao = new TesteLookAndFeel(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // classe interna privativa para tratar eventos dos bot~es de op~o o ca private class TratadorDeItens implements ItemListener { // processa a sele~o de apar^ncia e comportamento ca e // feita pelo usurio a public void itemStateChanged( ItemEvent evento ) { for ( int count = 0; count < radio.length; count++ ) { if ( radio[ count ].isSelected() ) { rotulo.setText( "Esta a apar^ncia " + e e strings[ count ] ); comboBox.setSelectedIndex( count ); mudeTheLookAndFeel( count ); } } } } }

13

Cap tulo 3 Bases de Estruturao das ca Interfaces Grcas a


Visto que agora j temos uma idia espacial concebida, resta-nos analisar a e a anatomia das interfaces grcas em Java, a qual baseia-se nos elementos a que sero descritos nestas prximas sees. a o co

3.1

Conteiners

Do suporte a exibio e agrupamento de outros componentes, inclusive a ca outros conteiners. Eles constituem a base onde os outros elementos so anea xados. Precisamente, o local onde podemos montar nossa aplicao. e ca Como veremos, em praticamente todos os nossos exemplos usamos um objeto da classe Container denominado continer. A ele atribu e mos uma chamada ao mtodo getContentPane( ), que devolve uma referncia para e e o painel de contedo do aplicativo ou do applet. O painel de contedo u u compreende a rea imediatamente inferior a barra de t a tulo de uma janela, extendendo-se at os limites da mesma. e A classe Container dene o mtodo add(Component), para adicionar e elementos, e setLayout (LayoutManager), que congura um gerenciador de leiaute para gerir o posicionamento e dimensionamento dos mesmos. Ressalta-se que a disposio dos elementos adicioandos a um continer ca e obedece a ordem em que eles foram anexados e ao gerenciador de leiaute previamnete denido. Se um conteiner no sucientemente dimensionado a e para acomodar os componentes anexados a ele, alguns ou todos os elementos GUI simplesmente no sero exibidos [1]. a a Qualquer programa que oferea uma interface vai possuir pelo menos um c conteiner [5], que pode ser : JFrame - janela principal do programa; JDialog - janela para dilogos; a JApplet - janela para Applets.

14

3.1.1

JFrame

Esta classe dene objetos que so frequentemente utilizadas para criar a aplicativos baseados em GUI. Eles consistem em uma janela com barra de t tulo e uma borda e fornecem o espao para a GUI do aplicativo ser consc tru da. A classe JFrame uma subclasse de java.awt.Frame, que por sua vez e subclasse de java.awt.Window. Pelo mecanismo de herana, nota-se que e c JFrames so um dos poucos componentes GUI do Swing que no so cona a a siderados de peso-leve, pois no so escritos completamente em Java. Sendo a a assim, quando poss vel, devemos devolver ao sistema os recursos ocupados pela janela, descartando-a. Frisamos que a janela de um programa Java faz parte do conjunto de componentes GUI da plataforma local e ser semelhante a a `s demais janelas, pois serve-se da bibilioteca grca do sistema em questo. a a Para exibir um titulo na barra de t tulo de uma JFrame, devemos chamar o construtor de superclasse de JFrame com o argumento String desejado, dessa forma:
1

super("Ttulo da Barra")

A classe JFrame suporta trs operaes quando o usurio fecha a janela. e co a Por default, a janela removida da tela (ocultada) quando o usurio ine a tervm indicando o seu fechamento. Isso pode ser controlado com o mtodo e e setDefaultCloseOperation(int), que utiliza como argumento as constantes da interface WindowConstants (pacote javax.swing) implementada por JFrame: DISPOSE ON CLOSE: descarta a janela devolvendo os seus recursos ao sistema; DO NOTHING ON CLOSE: indica que o programador determinar o a que fazer quando o usurio designar que a janela deve ser fechada; a HIDE ON CLOSE: (o default) a janela ocultada, removida da tela; e EXIT ON CLOSE: determinamos que quando fechamos a JFrame, o aplicativo seja nalizado. Essa constante denida na classe JFrame e foi e introduzida na verso 1.3 da Plataforma Java. a A janela s ser exibida na tela quando o programa invocar o mtodo o a e setVisible(boolean) com um argumento true, ou o mtodo show( ). O e tamanho da janela congurado com uma chamada ao mtodo setSize(int e e x, int y), que dene nos valores inteiros dos argumentos a largura e a altura da mesma. Se no chamarmos esse mtodo, somente a barra de t a e tulo ser a exibida. Tambm podemos utilizar o mtodo pack( ), que utiliza os tamanhos e e preferidos dos componentes anexados ao painel de contedo para determiu nar o tamanho da janela. Por tamanho preferido, entende-se uma chamada realizada pelos gerenciadores de leiaute ao mtodo getPreferredSize( ) de e cada componente GUI. Esse mtodo indica o melhor tamanho para os come ponentes. E herdado da classe java.awt.Component, de modo que todos

15

os objetos que derivem-se dessa classe podem responder a essa evocao. Ela ca devolve um objeto da classe Dimension (pacote java.awt). Podemos fazer uso dos mtodos setMinimumSize(Dimension) e sete MaximumSize(Dimension), que estabelecem os tamanhos extremos dos elementos. O componente no deveria ser maior que o tamanho mximo a a e nem menor que o m nimo. Entretando, esteja consciente de que certos gerenciadores de leiaute ignoram essa sugesto [2]. a Todos os elementos tem um tamanho preferido default, como, por exemplo, um objeto JPanel, que tem altura e largura de 10 pixels. Se necessitarmos mudar esse tamanho default, devemos sobreescrever o mtodo gete PreferredSize( ), fazendo com que ele retorne um objeto Dimension que contenha a nova largura e altura do componente, ou usar o mtodo setPree ferredSize(new Dimension( int x, int y)). No que concerce ao posicionamento, por default, o canto superior esquerdo da janela posicionado nas coordenadas (0, 0) da tela, ou seja, no e canto superior esquerdo. Podemos alterar essa caracter stica com o mtodo e setLocation(int x, int y). Mais a frente, discutiremos os eventos geradados pela manipulao de ca janelas e como trat-los. a JDesktopPane e JInternalFrame So classes que fornecem suporte ` criao de interfaces de multiplos a a ca documentos. Uma janela principal (pai) contm e gerencia outras janelas e (lhas). A grande utilidade disso que podemos visualizar vrios documentos e a que esto sendo processados em paralelo ao mesmo tempo, facilitando a a edio ou leitura dos mesmos. Veremos logo mais ` frente a interface que ca a e 1 o e implemetada por nosso exemplo, cujo cdigo que obtm as funcionalidades mencionadas anteriormente o seguinte: e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

// Demonstra JDesktopPane e JInternalFrame import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJDesktop extends JFrame { private JDesktopPane desktop; // configura a GUI public TesteJDesktop() { super( "Testando JInternalFrame contida em" + "uma JDesktopPane" ); // cria barra de menus JMenuBar barra = new JMenuBar(); // cria menu "Arquivo" JMenu arquivo = new JMenu( "Arquivo" ); // cria itens do menu "Arquivo"
1

Julgamos conveniente mostrar a aparncia desse componente, pois no o utilizaremos e a nos prximos exemplos, diferentemente de JFrames, que so a base da maioria deles. o a

16

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

JMenuItem novo = new JMenuItem( "Novo" ); JMenuItem sair = new JMenuItem( "Sair" ); // anexa os itens ao menu "Arquivo" arquivo.add( novo ); arquivo.add( sair ); // anexa o menu "Arquivo" ` barra de menus a barra.add( arquivo ); // anexa a barra de menus ` janela do aplicativo a setJMenuBar( barra ); // configura a "desktop" desktop = new JDesktopPane(); desktop.setBackground(Color.lightGray); desktop.setToolTipText("Eu sou a JDesktopPane. " + "Voc^ pode utilizar meu menu."); e this.getContentPane().add( desktop ); // configura ouvinte para o item de menu "Novo" novo.addActionListener( // classe interna an^nima para tratar eventos do o // item de menu "Novo" new ActionListener() { // exibe nova janela interna public void actionPerformed( ActionEvent evento ) { // cria a janela interna JInternalFrame frame = new JInternalFrame( "Janela Interna", true, true, true, true ); // obtm painl de contedo da janela interna e e u Container container = frame.getContentPane(); JanelaInterna interna = new JanelaInterna(); // anexa ao painel de contedo da janela interna u // um objeto da classe "JanelaInterna" container.add( interna, BorderLayout.CENTER ); // configura o tamanho da janela interna com o tamanho // do seu contedo u frame.pack(); // anexa a janela interna ` "Desktop" e a exibe a desktop.add( frame ); frame.setVisible( true ); } } ); // configura ouvinte para o item de menu "Sair" sair.addActionListener( // classe interna an^nima para tratar eventos do item de menu "Sair" o new ActionListener() {

17

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

// encerra o aplicativo public void actionPerformed( ActionEvent evento ) { System.exit( 0 ); } } ); // determina o tamanho da janela do aplicativo setSize( 700, 600 ); // determina que o contedo anexado ` janela seja exibido u a setVisible( true ); } // executa a aplica~o ca public static void main( String args[] ) { TesteJDesktop aplicacao = new TesteJDesktop(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } class JanelaInterna extends JPanel{ private JTextArea areaTexto; public JanelaInterna() { // cria uma rea de texto a areaTexto = new JTextArea(25,25); // configura mudana automtica de linha c a areaTexto.setLineWrap(true); // determina que as mudana de linha seja definida pelas palavras c areaTexto.setWrapStyleWord(true); // configura o texto a ser exibido areaTexto.setText("Este material destina-se a usurios da liguagem " + a "Java que pretendem incluir interfaces grficas em suas aplica~es,"+ a co "sejam elas aut^nomas ou applets. Salientamos que de grande valia ao " + o e "usurio se este j estiver familiarizado com a Linguagem Java, pois " + a a "o contedo desse material n~o explana conceitos bsicos, nem discute a " + u a a "sintaxe da Linguagem."); // adiciona barras de rolagem se o tamanho da // da `rea de texto for insuficiente para exibir o texto a this.add(new JScrollPane(areaTexto)); } }

Chamamos a ateno para o construtor da JInternalFrame (new JIterca nalFrame(String, boolean, boolean, boolean, boolean)) que nos seus cinco argumentos dene, respectivamente: o t tulo para a barra de t tulo da janela interna; indica se ela pode ser redimensionada pelo usurio; a indica se ela pode ser fechada pelo usurio; a 18

Figura 3.1: Interface do exemplo que usa JDesktopPane e JInternalFrame

congura se ela poder ser maximizada pelo usurio; a dene se ela pode ser minimizada pelo usurio. a Como ocorre com objetos das classes JFrame e JApplet, um JInternalFrame tem um painel de contedo ao qual os componentes GUI podem ser u anexados. Sabendo disso, criamos um objeto da classe JanelaInterna e o anexamos ao painel de contedo da JInternalFrame em nosso exemplo. u

3.1.2

JDialog

Usamos a classe JDialog, que susbclasse de java.awt.Dialog para e criarmos caixas de dilogo elaboradas, embora mais limitados que as oria ginadas por JFrames. Em prol da facilidade, a classe JOptionPane, que est denida no pacote de extenso javax.swing, oferece caixas de dilogo a a a pr-denidas que permitem aos programas exibir simples mensagens para os e usurios. Cada vez que usamos uma JOptionPane para implementar um a dilogo, na verdade estamos usando uma JDialog nos bastidores. A razo a a que JOptionPane so simplesmente um continer que pode automaticae a e mente criar uma JDialog e anexa-la ao seu painel de contedo [2]. u 19

Embora esses dilogos sejam maneiras vlidas de receber entrada do a a usurio e exibir a sa de um programa, suas capacidades so um tanto a da a limitadas - o dilogo pode obter somente um valor por vez e s pode exibir a o uma mensagem. Mais usual receber vrias entradas de uma s vez, de modo e a o que o usurio possa visualizar todos os campos de dados. A medida que fora mos avanando no contedo, o leitor ser capaz de sanar tais decincias c u a e usando novos componentes. As caixa de dilogo podem ser conguradas como modais ou no-modais, a a valendo-se do mtodo setModal(boolean). As modais no permitem que e a qualquer outra janela do aplicativo seja acessada at que seja tratada a soe licitao ou interveno da caixa de dilogo. O comportamento oposto se ca ca a observa nas no-modais. Os dilogos exibidos com a classe JOptionPane, a a por defaut, so dilogos modais. Alm disso, podemos denir se o tamanho a a e de uma JDialog redimensionvel, com o mtodo setResizable(boolean). e a e Obviamente, devido a diversidade de funcionalidades e de construtores, para usarmos todas as potencialidades devemos estudar profundamente as classes em questo. Abaixo mostraremos alguns mtodos estticos da classe a e a JOptionPane.(todos so precedidos por JOptionPane.) e a sintaxe mais a comumente utilizada para criarmos caixas de dilogo pr-denidas: a e showInputDialog(String) Mtodo usado para solicitar a entrada de e algum dado em forma de String. Lembre-se que os valores recebidos devem ser atribu dos ` variveis do tipo String e convertidos para outros tipos caso a a desejarmos realizar operaes sobre eles. co showMessageDialog(Component, Object, String, int, Icon) Mtodo e que exibe uma caixa de dilogo com texto, a cone, posicionamento e t tulo denidos pelo programador. O propsito do primeiro argumento especiar a janela-pai para a caixa o e de dilogo. Um valor null indica que a caixa de dilogo ser exibida no a a a centro da tela. No caso de nossa aplicao apresentar vrias janelas, podemos ca a especicar nesse argumento a janela-pai, de modo que a caixa de dilogo a aparecer centralizada sobre a janela-pai especiacada, que necessariamente a pode no corresponder ao centro da tela do computador. a O segundo argumento normalmente especica o String a ser mostrado ao usurio. A caixa de dilogo comporta qualquer tamanho de String, j que a a a a mesma dimensionada automaticamente para acomodar o texto. Tambm e e poss exibir longas saidas baseadas em texto,passando como argumento e vel para o mtodo um objeto da classe JTextArea. e O terceiro argumento denomina a barra de t tulo. E opcional j que, se a forem ignorados o terceiro e o quarto argumento, a caixa de dilogo exibir a a uma mensagem do tipo INFORMATION MESSAGE, com o texto Message na barra de t tulo e um cone de informao ` esquerda da mensagem de texto. ca a O quarto argumento refere-se ao cone que ser exibido e ao tipo de dilogo a a de mensagem. Podemos fazer uso dos seguintes valores para as constantes [1]: JOptionPane.ERROR MESSAGE Indica mensagem de erro ao usurio; a 20

JOptionPane.INFORMATION MESSAGE Exibe uma mensagem com informaes que podem ser dispensadas; co JOptionPane.WARNING MESSAGE Indica mensagem de advertncia e sobre algum problema em potencial; JOptionPane.QUESTION MESSAGE Impe uma mensagem que pero gunta algo ao usurio; a JOptionPane.PLAIN MESSAGE Exibe um dilogo que simplesmente a contm uma mensagem sem nenhum e cone. No ultimo argumento podemos denir um cone (classe Icon) que ser a exibido junto da caixa de dilogo. Ele deve residir no mesmo diretrio da a o aplicao ou teremos que especicar o caminho. ca showOptionDialog(Component, Object, String, int, int, Icon, Object[ ],Object) Este mtodo apresenta tudo o que foi descrito no mtodo e e precedente a ainda suporta a criao de outros botes, para opes persoca o co nalizadas. Como voc pode observar, os trs primeiros argumentos so os e e a mesmos do mtodo precedente. e O quarto refere-se ao conjunto de botes que aparecem abaixo do dilogo. o a Escolha um a partir do conjunto de valores padro: a DEFAULT OPTION, YES NO OPTION; YES NO CANCEL OPTION, OK CANCEL OPTION. O quinto argumento aqui o mesmo que o o quarto descrito no mtodo e e precedente, ou seja, determina o tipo de mensagem exibida no dilogo. a O sexto, refere-se ao cone que ser exibido no dilogo. a a O argumento seqente determina que os botes de opo apaream abaixo u o ca c do dilogo. Geralmente, especicamos um array de Strings para rotular os a botes, sendo que cada elemento do array dene um boto. o a Cada vez que selecionamos um boto, um valor inteiro que corresponde ao a ndice do array retornado pela JOptionPane. Voc ver no exemplo2 logo e e a adiante que podemos atribuir esse valor a uma varivel e posteriormente a pode-se implementar um processo de deciso que corresponda ` escolha feita a a pelo usurio. a Finalmente, o ultimo argumento dene o boto default a ser selecionado. a
1 2 3 4 5 6 7 8 9 10

// Demonstra JOPtionPane import java.awt.*; import javax.swing.*; public class TesteJOptionPane extends JFrame { String nome; String sobrenome; String todoNome; String stringNumero1;
2

O feedback de todos esses mtodos pode ser visualizado na execuo do cdigo. e ca o

21

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

String stringNumero2; int valorInteiroNumero1; int valorInteiroNumero2; int soma, valor; JTextArea areaTexto; JLabel selecao; Icon seta_90 = new ImageIcon( "figuras/seta_90.gif" ); final JDialog dialogo; String[] opcoes = {"Sim, plenamente","N~o, muito chato!", a e "Estou tentando...","J sei tudo!"}; // titulo dos bot~es a o public TesteJOptionPane() { setTitle("Testando JOptionPanes e JDialogs"); setSize( 500, 300 ); setVisible( true ); // l^ o prompt e armazena o string na varivel e a nome = JOptionPane.showInputDialog( "Digite seu nome" ); // l^ o prompt e armazena o string na varivel e a sobrenome = JOptionPane.showInputDialog( "Digite seu sobrenome" ); // adiciona os strings todoNome = nome +" "+ sobrenome; // l^ o primeiro nmero e armazena o string na varivel e u a stringNumero1 = JOptionPane.showInputDialog( "Digite " + "um numero inteiro" ); // l^ o segundo nmero e armazena o string na varivel e u a stringNumero2 = JOptionPane.showInputDialog( "Digite " + "outro numero inteiro" ); // converte os strings para valores inteiros valorInteiroNumero1 = Integer.parseInt( stringNumero1 ); valorInteiroNumero2 = Integer.parseInt( stringNumero2 ); // adiciona os valores inteiros soma = valorInteiroNumero1 + valorInteiroNumero2; areaTexto = new JTextArea(); areaTexto.setText("Seu Nome\tSeu Sobrenome\n" + nome + "\t" + sobrenome); // mostra o resultado das adi~es no centro da janela co // do aplicativo (usa cone personalizado) JOptionPane.showMessageDialog(this, "Seu nome completo : " e + todoNome, "Nome Completo", JOptionPane.PLAIN_MESSAGE, seta_90 // mostra o resultado das adi~es em uma JTextArea no co // centro da janela do aplicativo JOptionPane.showMessageDialog(this, areaTexto, "Nome Completo", JOptionPane.INFORMATION_MESSAGE); // mostra o resultado das adi~es no centro da tela com ttulo default co JOptionPane.showMessageDialog(this, "A soma : " + soma ); e // demais tipos de mensagens

);

22

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

JOptionPane.showMessageDialog(null, "Qualquer Mensagem de Alerta", "ATENC~O!", JOptionPane.WARNING_MESSAGE ); A JOptionPane.showMessageDialog(this, "Qualquer Mensagem Informativa", "Voc^ sabia que...", JOptionPane.INFORMATION_MESSAGE ); e JOptionPane.showMessageDialog(null, "Qualquer Mensagem de Erro", "AVISO DO SISTEMA", JOptionPane.ERROR_MESSAGE ); JOptionPane.showMessageDialog(this, "Qualquer Mensagem Interrogativa", "Responda!", JOptionPane.QUESTION_MESSAGE ); // caixa de dilogo com bot~es de op~es personalizadas de escolha a o co // opcoes[0] define o bot~o selecionado por default a int n = JOptionPane.showOptionDialog( this, // o aplicativo a janela pai e "Voc^ est aprendendo com este material?", // texto mostrado ao usurio e a a "Avalia~o do trabalho ", ca // ttulo da barra de ttulo JOptionPane.DEFAULT_OPTION, // conjunto de bot~es o JOptionPane.QUESTION_MESSAGE, // tipo de mensagem exibida null, // indica que n~o usamos cone personalizado a opcoes, // cada bot~o um elemento desse array a e opcoes[0]); // bot~o default a ser selecionado a selecao = new JLabel("Voc^ selecionou " + "\"" + opcoes[n] + "\"" e + " na caixa anterior"); dialogo = new JDialog( this ,"Sou uma JDialog modal", true); dialogo.setSize(400,200); dialogo.setContentPane(selecao); dialogo.setVisible(true); } // inicia a execu~o do aplicativo Java ca public static void main( String args[] ) { TesteJOptionPane aplicacao = new TesteJOptionPane(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

3.1.3

JApplet

Applet so programas Java que podem ser embutidos em documentos a HTML. Quando um navegador carrega uma pgina da Web que contm um a e applet, ele baixa esse applet e o executa (o navegador chamado de continer e e de applets. Os navegadores da World Wide Web que suportam applets esperam que nossos applets tenham certos atributos e comportamentos. A classe JApplet (pacote javax.swing.JApplet) fornece todas essas capacidades, bastando ao programador construir classes que extendam-se dela. Como nosso prsito compor interfaces, necessrio esclarecer que, com o e e a applets continuamos trabalhando da mesma forma, ou seja, devemos anexar nossos componentes ao painel de contedo do applet, distribuindo-os com os u gerenciadores de leiaute. A peculiaridade que dimensionamos o tamanho e do applet num arquivo de texto plano salvo com extenso HTML, como a 23

mostrado abaixo:
1 2 3 4

<HTML> <applet code = "classe do applet.class" width = "100" height = "100"> </applet> </HTML>

Este arquivo, que deve ser armazenado no mesmo local que o applet reside, indica qual applet deve ser carregado e executado pelo continer de e applets, bem como o tamanho do mesmo. Note que o nome do arquivo e formado pela classe j compilada. a Outro ponto relevante que em applets, devemos denir a inicializao e ca dos componentes GUI e anexa-los ao painel de contedo no escopo do mtodo u e public void init(), que se assemelha ao construtor de um aplicativo independente. Este mtodo chamado automaticamente pelo conteiner de applets, e e o qual carrega o applet, inicializa as variveis de instncia e cria a interface a a grca. a Embora applets sejam muito interessates, por fugir do escopo desta apostila, no iremos explicitar os demais mtodos, bem como maiores datalhes a e sobre a implementao de applets. ca

3.2

Painis e

So reas que comportam outros componentes, inclusive outros painis3 . a a e Em outras palavras, so elementos que fazem a intermediao entre um a ca continer e os demais GUI anexados. So criados com a classe JPanel, e a que derivada da classe Container. As JPanel possibilitam a criao de e ca subconjuntos num continer de forma ` garantir um maior dom sobre toe a nio das as reas da interface. Aqui, o jargo dividir para conquistar se justica a a plenamente. A classe JPanel no tem painel de contedo como applets e JFrames, a u assim, os elementos devem ser diretamente adicioandos ao objeto painel. Alm de agregar um conjunto de componentes GUI para ns de leiaute, e podemos criar reas dedicadas de desenho e reas que recebem eventos do a a mouse. Para isso, devemos implementar subclasses de JPanel e fornecerlhes tais capacidades sobrescrevendo determinados mtodos que no sero e a a mencioandos nesse curso. Cabe lembrar que JPanel no suportam eventos a convencionais suportados por outros componentes GUI, como botes, campos o de texto e janelas. Apesar disso, JPanel so capazes de reconhecer eventos a de n mais baixo, como eventos de mouse e de teclas. vel

3.3

Gerenciadores de Leiaute

Organizam os componetes GUI de um continer e, para tal, devem ser e congurados antes que qualquer membro seja anexado ao painel de contedo. u
Inmeros exemplos deste material explicitam o uso de painis, de modo que nenhum u e exemplo especial foi criado. Assim sendo, aconselhamos o leitor a vericar nas implementaes o uso dos mesmos. co
3

24

Dir amos que os gerenciadores trabalham como arquitetos, que, aps alguo mas denies do programador, distribuim os elementos no espao que foi co c incumbido a eles. Sua utilizao poupa o programador da preocupao de ca ca posicionar precisamente cada componente. Embora somente seja permitido apenas um gerenciador de leiaute por continer, na elaborao de interfaces complexas, que, com freqncia, cone ca ue sistem em um continer onde esto anexados mltiplos painis com divere a u e sos componentes, podemos usar um gerenciador de leiaute por painel, desse modo, distribuindo os elementos de uma forma mais renada e precisa. Vejamos cada um deles e suas metodologias:

3.3.1

FlowLayout

E o gerenciador mais elementar. Distribui os componentes pelo continer e seqencialmente, da esquerda para a direita e na ordem em que foram adiciou nados. Seu comportamento assemelha-se a um editor de texto, j que quando a se alcana a borda do continer, os membros so alocados na prxima linha. c e a o A classe FlowLayout permite que os componentes sejam alinhados ` a esquerda, a direita e centralizados (padro). Exercite isso em nosso exemplo, a clicando nos botes espec o cos para cada direo de alinhamento. Ressalta-se ca que este o gerenciador default dos JPanels. e

Figura 3.2: Interface do exemplo que usa FlowLayout

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

// Demonstra os alinhamentos possveis do gerenciador FlowLayout import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteFlowLayout extends JFrame { private JButton esquerda, centro, direita; private Container container; private FlowLayout layout; private JLabel pet; private Icon logoPet = new ImageIcon( "figuras/logo.jpg" ); // configura a GUI e registra ouvintes dos bot~es o public TesteFlowLayout()

25

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

{ super( "Testando o gerenciador FlowLayout" ); pet = new JLabel(""); pet.setIcon(logoPet); // obtm painl de contedo e e u container = getContentPane(); layout = new FlowLayout(); // e configura o leiaute container.setLayout( layout ); container.add( pet ); // cria o bot~o "Esquerda" e registra ouvinte a esquerda = new JButton( "Esquerda" ); esquerda.addActionListener( // classe interna an^nima o new ActionListener() { // processa eventos do bot~o "Esquerda" a public void actionPerformed( ActionEvent evento ) { layout.setAlignment( FlowLayout.LEFT ); // realinha os components que foram anexados layout.layoutContainer( container ); } } ); container.add( esquerda ); // cria o bot~o "Centro" e registra ouvinte a centro = new JButton( "Centro" ); centro.addActionListener( // classe interna an^nima o new ActionListener() { // processa eventos do bot~o "Esquerda" a public void actionPerformed( ActionEvent evento ) { layout.setAlignment( FlowLayout.CENTER ); // realinha os components que foram anexados layout.layoutContainer( container ); } } ); container.add( centro ); // cria o bot~o "Direita" e registra ouvinte a direita = new JButton( "Direita" ); direita.addActionListener(

26

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

// classe interna an^nima o new ActionListener() { // processa eventos do bot~o "Direita" a public void actionPerformed( ActionEvent evento ) { layout.setAlignment( FlowLayout.RIGHT ); // realinha os components que foram anexados layout.layoutContainer( container ); } } ); container.add( direita ); setSize( 250, 250 ); setVisible( true ); } // executa a aplica~o ca public static void main( String args[] ) { TesteFlowLayout aplicacao = new TesteFlowLayout(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

3.3.2

BorderLayout

O painel de contedo utiliza como default esse gerenciador. Suas virtudes u residem na possibilidade de organizar os componentes GUI em cinco regies: o NORTH, SOUTH, EAST, WEST e CENTER. At cinco componentes podem e ser adicionados (em qualquer ordem) a um continer ou painel que esteja e congurado com esse gerenciador, sendo que cada um dever ocupar uma a regio. Acarreta-se que, no caso de mais de um elemento ser adicionado ` a a mesma rea, somente o ultimo anexado ser vis [1]. a a vel Os componentes colocados nas regies NORTH e SOUTH estendem-se o horizontalmente para os lados do continer e tem a mesma altura que o e componente mais alto anexado em uma dessas regies. o As regies EAST e WEST expandem-se verticalmente entre as regies o o NORTH e SOUTH e tem a mesma largura que o componente mais largo colocado nessas regies. o O elemento colocado na regio CENTER expande-se para ocupar todo o a espao restante no leiaute. Se a regio NORTH ou SOUTH no for ocupada, c a a os membros das regies EAST, CENTER e WEST expandem-se verticalo mente para preencher o espao restante. Caso a regio CENTER no seja c a a ocupada, a rea permanecer vazia, pois os outros componentes no se exa a a pandem para preencher o espao que sobra [1]. c No implementamos nenhum cdigo especial aqui, pois a aplicao desse a o ca gerenciador pode ser vista em muitos de nossos exemplos. Cita-se a organizao de um painel que constitui uma carta do aplicativo que demonstra ca

27

o gerenciador CardLayout4 .

Figura 3.3: Interface do exemplo que usa BorderLayout para gerenciar a Ultima Carta.

3.3.3

GridLayout

Este um dos gerenciadores mais interessantes at aqui, pois a rea sob e e a sua jurisdiao dividida em linhas e colunas convenientes, formando uma c e grade, que, ` medida que os componentes so anexados, preenchida da a a e clula superior esquerda em direo ` direita. Aps preenchida a linha, o e ca a o processo continua na linha imediatamente inferior. Cada membro em um GridLayout tem a mesma largura e comprimento. Podemos ver a aplicao ca desse gerenciador na gura 3.3, logo acima. Repare como os botes foram o organizados. Isso foi conseguido com a seguinte implementao, que um ca e fragmento do cdigo do exemplo precedente: o
1 2 3 4

// configura a `rea do painel "AreaDosBotoes" a // com quatro colunas e uma linha JPanel AreaDosBotoes = new JPanel(); AreaDosBotoes.setLayout( new GridLayout( 4, 1 ) );

3.3.4

BoxLayout

Permite que os componentes GUI sejam organizados da esquerda para direita (ao longo do eixo x) ou de cima para baixo (ao longo do eixo y) em um continer ou painel. A classe Box fornece mtodos estticos para criarmos e e a caixas horizontais ou verticais que podem ser usadas para acomodar botes o por exemplo, sendo que o gerenciador default do continer criado Boxe e Layout. Tambm disponibiliza mtodos que agregam outras caracter e e sticas peculiares ao continer, como, por exemplo [1]: e createVerticalStrut(int) : createHorizontalStrut(int) : Adicionam um suporte vertical ou horizontal ao continer. Esse suporte um componente invis e tem uma e e vel altura xa em pixels (que passada no argumento). E utilizado para e
Voc ver que podemos empilhar painis que so organizados individualmete por e a e a gerenciadores diferentes em um monte, que por sua vez gerido pelo gerenciador Care dLayout.
4

28

garantir uma quantidade xa de espao entre os componentes GUI, c caso a janela seja redimensionada. createVerticalGlue() : createHorizontalGlue() : Adicionam cola vertical ou horizontal ao continer. e A cola um componente invis e vel, sendo utilizada em componentes GUI de tamanho xo. Ela mantm uniforme o espaamento entre membros e c de um continer, normalmente deslocando o espao extra oriundo do e c redimensionamento da janela ` direita do ultimo componente GUI hoa rizontal, ou abaixo do ultimo componente GUI vertical. createRigidArea(new Dimension(x, y)) : E um elemento invis que vel tem altura e larguras xas. O argumento para o mtodo um objeto e e Dimension, que especica as dimenses da rea r o a gida. Tal rea no a a sofre perturbao quando a janela redimensionada. ca e createGlue() : Mantm uniforme o espaamento entre os membros de um e c continer, se expandindo ou contraindo conforme o tamanho da Box. e Manipule a janela do aplicativo que testa esse gerenciador para ter um feedback referente aos mtodos acima descritos. e

Figura 3.4: Interface do exemplo que usa BoxLayout

1 2 3 4 5 6 7 8 9 10 11

// Demonstra BoxLayout import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteBoxLayout extends JFrame { private JTextArea texto; // configura a GUI public TesteBoxLayout()

29

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

{ // texto da barra de ttulo super( "Demostrando BoxLayout" ); final int TAMANHO = 3; // obtm painel de contedo e u Container container = getContentPane(); // configura seu layout com BorderLayout, // 30 pixels de espaamento vertical e c // horizontal entre os componentes container.setLayout( new BorderLayout(30,30) ); // cria conteiners Box configurados com o leiaute // default BoxLayout Box boxes[] = new Box[ 2 ]; // cria rea de texto com o tamanho dos argumentos a texto = new JTextArea(10,15); // configura mudana automatica de linha c texto.setLineWrap(true); // retorna um conteiner Box e o configura // como caixa horizontal boxes[ 0 ] = Box.createHorizontalBox(); // retorna um conteiner Box e o configura // como caixa vertical boxes[ 1 ] = Box.createVerticalBox(); for ( int count = 0; count < TAMANHO; count++ ){ // cria suporte horizontal e configura em // 10 pixels o espao entre bot~es c o boxes[ 0 ].add(Box.createHorizontalStrut(10)); // adiciona bot~es ` boxes[0] o a boxes[ 0 ].add( new JButton( "Caixa Horizontal: " + count ) ); } for ( int count = 0; count < TAMANHO; count++ ) { // cria cola vertical, que gerencia a distribui~o ca // de espaos entre bot~es c o boxes[ 1 ].add(Box.createVerticalGlue()); // adiciona bot~es ` boxes[1] o a boxes[ 1 ].add( new JButton( "Caixa Vertical: " + count ) ); } // cria painel JPanel painel = new JPanel(); // e o configura na horizontal com o leiaute BoxLayout painel.setLayout(new BoxLayout( painel, BoxLayout.X_AXIS ) ); for ( int count = 0; count < TAMANHO; count++ ) { // cria cola, que mantm os bot~es uniformemente e o // distribudos no painel caso ele seja redimensionado painel.add(Box.createGlue()); // adiciona bot~es ao painel o painel.add( new JButton( "Painel: " + count ) ); }

30

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

// anexa painis `s regi~es do conteiner e a o container.add( boxes[ 0 ], BorderLayout.NORTH ); container.add( boxes[ 1 ], BorderLayout.EAST ); container.add( new JScrollPane(texto), BorderLayout.CENTER ); container.add( painel, BorderLayout.SOUTH ); setSize( 470, 250 ); setVisible( true ); } // executa a aplica~o ca public static void main( String args[] ) { TesteBoxLayout aplicacao = new TesteBoxLayout(); // configura o encerramento da aplica~o ca aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // dimensiona a janela // exibe a janela

3.3.5

CardLayout

A serventia desse gerenciador que ele organiza os componentes como se e fossem cartas de um baralho. Qualquer carta pode ser exibida na parte superior da pilha, a qualquer momento, valendo-se dos mtodos da classe e CardLayout. Cada carta normalmente um continer, como um painel, e e que pode utilizar qualquer gerenciador de leiaute. No exemplo que refere-se a esse gerenciador, a Primeira Carta foi congurada com o gerenciador BorderLayout, assim como a Terceira Carta, sendo que em a cada regio a dessa ultima foi anexado um painel contendo o nome da respectiva regio. a J a Segunda Carta usa o gerenciador FlowLayout. a

Figura 3.5: Interface do exemplo que usa CardLayout

1 2 3 4 5 6 7 8

// Demonstra CardLayout import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteCardLayout extends JFrame implements ActionListener {

31

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

private CardLayout gerenciadorDeCartas; private JPanel monte; private JButton botao[]; private String nomes[] = { "Primeira Carta", "Segunda Carta", "Carta Anterior", "ltima Carta" }; U // configura a GUI public TesteCardLayout() { // texto da barra de ttulo super( "Testando CardLayout " ); // obtm painel de contedo e u Container container = getContentPane(); // cria um JPanel monte = new JPanel(); // e o configura com CardLayout gerenciadorDeCartas = new CardLayout(); monte.setLayout( gerenciadorDeCartas ); // configura rtulo e figura para a "carta1" o Icon logoPet = new ImageIcon( "figuras/logo.jpg" ); JLabel label1 = new JLabel( "Esta a Primeira Carta",SwingConstants.CENTER); e JLabel figura = new JLabel(""); figura.setIcon(logoPet); figura.setHorizontalAlignment(SwingConstants.CENTER); // cria a "carta1" e a adiciona ao JPanel "monte" JPanel carta1 = new JPanel(); carta1.setLayout(new BorderLayout()); carta1.add( label1,BorderLayout.NORTH ); carta1.add( figura,BorderLayout.CENTER ); monte.add( carta1, label1.getText() ); // adicionando ao "monte" // configura a "carta2" e a adiciona ao JPanel "monte" JLabel label2 = new JLabel( "Esta a Segunda Carta", SwingConstants.CENTER ); e JPanel carta2 = new JPanel(); carta2.setLayout(new FlowLayout()); carta2.setBackground( Color.orange ); carta2.add( label2 ); monte.add( carta2, label2.getText() ); // adicionando ao "monte" // configura a "carta3" e a adiciona ao JPanel "monte" JLabel label3 = new JLabel( "Esta a Terceira Carta" ); e JPanel carta3 = new JPanel(); carta3.setLayout( new BorderLayout() ); carta3.add( new JButton( "Regi~o Norte" ), BorderLayout.NORTH ); a carta3.add( new JButton( "Regi~o Oeste" ), BorderLayout.WEST ); a carta3.add( new JButton( "Regi~o Leste" ), BorderLayout.EAST ); a carta3.add( new JButton( "Regi~o Sul" ), BorderLayout.SOUTH ); a carta3.add( label3, BorderLayout.CENTER ); monte.add( carta3, label3.getText() ); // adicionando ao "monte" // cria e aloca os bot~es que controlar~o o "monte" o a JPanel AreaDosBotoes = new JPanel();

32

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

// configura a `rea do painel "AreaDosBotoes" a // com quatro colunas e uma linha AreaDosBotoes.setLayout( new GridLayout( 4, 1 ) ); botao = new JButton[ nomes.length ]; for ( int count = 0; count < botao.length; count++ ) { botao[ count ] = new JButton( nomes[ count ] ); // registra a aplica~o para tratar os eventos ca // de precionamento dos bot~es o botao[ count ].addActionListener( this ); AreaDosBotoes.add( botao[ count ] ); } // adiciona o JPanel "monte" e JPanel "bot~es" ao conteiner o container.add( AreaDosBotoes, BorderLayout.WEST ); container.add( monte, BorderLayout.CENTER ); setSize( 490, 200 ); // dimensiona a janela setVisible( true ); // exibe a janela } // trata os eventos dos bot~es fazendo a troca das cartas o public void actionPerformed( ActionEvent evento ) { // mostra a primeira carta if ( evento.getSource() == botao[ 0 ] ) gerenciadorDeCartas.first( monte ); // mostra a prxima carta o else if ( evento.getSource() == botao[ 1 ] ) gerenciadorDeCartas.next( monte ); // mostra a carta anterior else if ( evento.getSource() == botao[ 2 ] ) gerenciadorDeCartas.previous( monte ); // mostra a ltima carta u else if ( evento.getSource() == botao[ 3 ] ) gerenciadorDeCartas.last( monte ); } // executa a aplica~o ca public static void main( String args[] ) { TesteCardLayout aplicacao = new TesteCardLayout(); // configura o encerramento da aplica~o ca aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

3.3.6

GridBagLayout

Finalmente chegamos ao mais complexo e poderoso dos gerenciadores de leiaute predenidos. Voc notar uma grande semelhana entre este gerene a c ciador e o GridLayout, j que ambos utilizam uma grade para dispor os a

33

componentes GUI. No entanto, o GridBagLayout muito mais ex e vel e admite variaes no tamanho dos elementos, tanto no nmero de linhas, co u como no de colunas, isto , os componentes podem ocupar mltiplas linhas e u ou colunas. Inicialmente, propomos que o leitor esboce um rascunho da GUI em um papel e depois trace linhas e colunas sobre ele, respeitando as extremidades dos componentes que deseja criar, de modo que cada elemento que incluso em uma ou mais clulas resultante da interseco entre linhas e colunas. e ca Posteriormente, deve-se numerar as linhas e colunas, iniciando a contagem pelo zero. Isso valido para denirmos os endereos nos quais os membros e c sero alocados. a Veja um esboo do que foi anteriormente descrito: c

Figura 3.6: Interface do exemplo que usa GridBagLayout

Para utilizarmos esse gerenciador, devemos instanciar um objeto GridBagConstraints, que vai fazer o trabalho de distribuir os componentes GUI, baseando-se nas restries das seguintes variveis de instncia da classe Gridco a a BagConstraints: gridx dene a coluna em que o canto superior esquerdo do componente ser a colocado. gridy dene a linha em que o canto superior esquerdo do componente ser a colocado. gridwidth determina o nmero de colunas que o componente ocupa. u gridheight dene o nmero de linhas que o componente ocupa. u ll especica quanto da rea destinada ao componente (o nmero de linhas a u e colunas) ocupada. A essa varivel atribui-se uma das seguintes e a constantes de GridBagConstraints: NONE indica que o elemento no crescer em nenhuma direo. a a ca E o valor default. VERTICAL sinaliza que o elemento crescer verticalmente. a HORIZONTAL informa que o elemento crescer horizontalmente. a 34

BOTH indica que o elemento crescer em ambas as direes. a co anchor especica a localizao do elemento na rea a ele destinada quando ca a este no preencher a rea inteira. A essa varivel atribui-se uma das a a a seguintes constantes de GridBagConstraints: NORTH, NORTHEAST; EAST, SOUTHEAST; SOUTH, SOUTHWEAST; WEST, NORTHWEST; CENTER, que o valor default e weightx dene se o componente ir ocupar espao extra horizontal, caso a a c janela seja redimensionada. O valor zero indica que o elemento no a se expande horizontalmente por conta prpria. Porm, se um membro o e da mesma coluna possuir a weightx congurada com um valor maior que zero, nosso elemento crescer horizontalmente na mesma proporo a ca que os outros membros dessa coluna. Isso ocorre porque cada componente deve ser mantido na mesma linha e coluna que foi endereado c originalmente. weighty dene se o componente ir ocupar o espao extra vertical, oriundo a c do redimensionamento da janela. O valor zero indica que o elemento no se expande verticalmente por conta prpria. Porm, se um membro a o e da mesma linha possuir a weighty congurada com um valor maior que zero, nosso elemento crescer verticalmente na mesma proporo a ca que os outros membros dessa linha. Veja isso na pratica com o exemplo TesteGridBagLayout. Para as duas ultimas variveis citadas, infere-se que valores de peso mai a ores acarretam maior abrangncia do espao adicional a esses componentes e c em detrimento a outros membros que portem valores inferiores. Se todos os componentes forem congurados com zero, os mesmos aparecero amontoa ados no meio da tela quando a janela for redimensionada. Ressalta-se que somente valores positivos so aceitos. a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

// Demonstra GridBagLayout import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteGridBagLayout extends JFrame { private Container container; private GridBagLayout layout; private GridBagConstraints restricoes; // configura a GUI public TesteGridBagLayout() { super( "Testando GridBagLayout" );

35

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

// obtm painl de contedo e e u container = getContentPane(); layout = new GridBagLayout(); // e o configura com GridBagLayout container.setLayout( layout ); // cria~o do objeto que gerencia o posicionamento ca // dos componentes no conteiner restricoes = new GridBagConstraints(); // cria os componenetes da GUI JTextArea areaDeTexto = new JTextArea( "Esse GUI n~o tem" + a " funcionalidade nenhuma!"); JLabel rotulo = new JLabel( "Redimensione a janela"); String bandas[] = { "Metallica", "Iron Maiden", "U2" }; JComboBox comboBox = new JComboBox( bandas ); JTextField textField JButton botao1 = new JButton botao2 = new JButton botao3 = new = new JTextField( "Eu sou um JTextField" ); JButton( "Abrir" ); JButton( "Salvar" ); JButton( "Imprimir" );

/****************ANEXAND0 COMPONENTES*************************/ // areaDeTexto // "weightx" e "weighty" s~o ambos zero: o valor default a // "anchor" para todos os componentes CENTER: o valor default e // preenchimneto BOTH e restricoes.fill = GridBagConstraints.BOTH; adicionarComponente( areaDeTexto, 1, 0, 1, 2 ); // comboBox // "weightx" e "weighty" s~o ambos zero: o valor default a // preenchimneto HORIZONTAL e adicionarComponente( comboBox, 0, 0, 1, 1 ); // botao "Abrir" // "weightx" e "weighty" s~o ambos zero: o valor default a // preenchimneto muda de BOTH para HORIZONTAL restricoes.fill = GridBagConstraints.HORIZONTAL; adicionarComponente( botao1, 0, 1, 2, 1 ); // botao "Salvar" restricoes.weightx = 1000; // pode se extender horizontalmente restricoes.weighty = 1; // pode se extender verticalmente // preenchimneto muda de HORIZONTAL para BOTH restricoes.fill = GridBagConstraints.BOTH; adicionarComponente( botao2, 1, 1, 1, 1 ); // botao "Imprimir" // preenchimneto BOTH e restricoes.weightx = 500; // pode se extender horizontalmente restricoes.weighty = 0.5; // pode se extender verticalmente adicionarComponente( botao3, 1, 2, 1, 1 ); // textField // "weightx" e "weighty" s~o ambos zero: o valor default a

36

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

// preenchimneto BOTH e adicionarComponente( textField, 3, 0, 3, 1 ); // rotulo // "weightx" e "weighty" s~o ambos zero: o valor default a // preenchimneto BOTH e adicionarComponente( rotulo, 2, 1, 2, 1 ); setSize( 450, 150 ); setVisible( true ); } // mtodo que ativa as restri~es e distribui os componentes e co private void adicionarComponente( Component componente, int linha, int coluna, int largura, int altura ) { // configura gridx e gridy restricoes.gridx = coluna; restricoes.gridy = linha; // configura gridwidth e gridheight restricoes.gridwidth = largura; restricoes.gridheight = altura; // configura restricoes e anexa cada componente layout.setConstraints( componente, restricoes ); container.add( componente ); } // executa a aplica~o ca public static void main( String args[] ) { TesteGridBagLayout aplicacao = new TesteGridBagLayout(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

Uma outra maneira de gerenciar o leiaute de um continer atribuir ao e e mtodo setLayout(LayoutManager) um argumento null e depois ajustar e o posicionamento em x, y, bem como a largura e altura de cada componente com o mtodo algumComponente.setBounds(int, int, int, int). Os argue mentos obedecem a ordem citada acima. Esta talvez seja a maneira mais a rdua de gerenciarmos a disposio dos elementos GUI. ca

37

Cap tulo 4 Componentes Atmicos o


So os botes, scrollbars, labels, sliders, check boxes, etc. Eles no podem a o a conter outros elementos.

4.1

JLabel

So rtulos inertes que geralmente informam ou descrevem a funcionaa o lidade de outros componentes GUI, como por exemplo, campos de texto, cones, etc. As instrues so mostradas por meio de uma linha de texto co a somente leitura, uma imagem, ou ambos. Aqui salientamos o uso do mtodo e setToolTipText(String), o qual fornece dicas de ferramenta a todos os elementos herdados da classe JComponent. Dessa forma, quando o usurio a posicionar o cursor do mouse sobre algum componente, car ciente da funo a ca do mesmo. Veremos isso nos exemplos. O contrutor mais elaborado JLabel(String, Icon, int). Os argumene tos representam o rtulo a ser exibido, um o cone e o alinhamento, respectivamente. Como vemos, tambm poss a exibio de e e vel ca cones em muito dos componentes Swing. Para JLabels, basta especicarmos um arquivo com extensao png, gif ou jpg no segundo argumento do construtor do JLabel, ou utilizarmos o mtodo setIcon(Icon) Lembramos que o arquivo da imae gem algumNome.xxx deve encontrar-se no mesmo diretrio do programa, ou o especica-se corretamente a estrutura de diretrios at ele. o e As constantes SwingConstants, que denem o posicionamento de vrios a componentes GUI e aqui so apropriadas ao terceiro argumento, determinam a a locao do ca cone em relao ao texto. So elas: ca a SwingConstants.NORTH, SwingConstants.SOUTH, SwingConstants.EAST, SwingConstants.WEST, SwingConstants.TOP, SwingConstants.BOTTOM, SwingConstants.CENTER, 38

SwingConstants.HORIZONTAL, SwingConstants.VERTICAL, SwingConstants.LEADING, SwingConstants.TRAILING, SwingConstants.NORTH EAST, SwingConstants.NORTH WEST, SwingConstants.SOUTH WEST, SwingConstants.SOUTH EAST, SwingConstants.RIGHT, SwingConstants.LEFT No iremos detalhar a funcionalidade de cada uma, pois os nomes j so a a a o sucientente auto-elucidativos.

Figura 4.1: Interface do exemplo que usa JLabel

1 2 3 4 5 6 7 8 9 10 11 12

// Demonstra a classe JLabel. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJLabel extends JFrame { private JLabel rtulo1, rtulo2, rtulo3, rtulo4; o o o o // configura a GUI public TesteJLabel() {

39

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

// texto da barra de ttulo super( "Testando JLabel" ); // obtm painel de contedo e u Container container = getContentPane(); // e configura seu layout container.setLayout( new FlowLayout() ); // construtor JLabel rotulado com o argumento String rtulo1 = new JLabel( "Descri~o de alguma coisa" ); o ca // o argumento do mtodo a dica de ferramenta que ser exibida e e a rtulo1.setToolTipText( "Dica de algo que isso faz" ); o // anexa o rtulo1 ao painel de contedo o u rtulo1.setBounds( 50,50, 200, 500); o container.add( rtulo1 ); o // construtor JLabel com argumento String, icone e alinhamento Icon seta_90 = new ImageIcon( "figuras/seta_90.gif" ); Icon seta_180 = new ImageIcon( "figuras/seta_180.gif" ); Icon seta_270 = new ImageIcon( "figuras/seta_270.gif" ); rtulo2 = new JLabel( "Descri~o de alguma coisa com um cone", o ca seta_90, SwingConstants.HORIZONTAL ); rtulo2.setToolTipText( "Outra dica de algo que isso faz" ); o container.add( rtulo2 ); o // construtor JLabel sem argumentos rtulo3 = new JLabel(); o rtulo3.setText( "Descri~o de alguma coisa com um cone" + o ca " e texto posicionado" ); rtulo3.setIcon( seta_180 ); o // posiciona o texto ` esquerda do rtulo a o rtulo3.setHorizontalTextPosition( SwingConstants.LEFT ); o // centraliza o texto em rela~o ao rtulo ca o rtulo3.setVerticalTextPosition( SwingConstants.CENTER ); o rtulo3.setToolTipText( "Orienta~o ` respeito desse rtulo" ); o ca a o container.add( rtulo3 ); o // construtor JLabel sem argumentos, que posteriormente ser a //configurado com os mtodos "set" e rtulo4 = new JLabel(); o rtulo4.setText( "Outra descri~o de alguma coisa com um cone" + o ca " e texto abaixo do rtulo" ); o rtulo4.setIcon( seta_270 ); o // centraliza o texto em rela~o ao rtulo ca o rtulo4.setHorizontalTextPosition( SwingConstants.CENTER ); o // posiciona o texto abaixo do rtulo o rtulo4.setVerticalTextPosition( SwingConstants.BOTTOM ); o rtulo4.setToolTipText( "Orienta~o ` respeito desse rtulo" ); o ca a o container.add( rtulo4 ); o // determina o tamanho da janela do aplicativo setSize( 450, 280 ); // determina que o contedo anexado ` janela seja exibido u a setVisible( true ); } // executa a aplicacao public static void main( String args[] ) {

40

72 73 74 75 76 77

TesteJLabel aplicacao = new TesteJLabel(); // configura o fechamento da janela aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

4.2

Botes o

E um componente que quando clicado dispara uma ao espec ca ca. Um programa Java pode utilizar vrios tipos de botes, incluindo botes de coa o o mando, caixas de marcao, botes de alternncia e botes de opo. Para ca o a o ca criarmos algum desses tipos de botes, devemos instanciar uma das muitas o classes que descendem da classe AbstractButton, a qua dene muito dos recursos que so comuns aos botes do Swing. Cita-se, por exemplo, a exibio a o ca de texto e imagens em um boto, o uso de caracteres mnemnicos, dentre a o outros. Vejamos a hierarquia de classes, partindo da classe JComponent: -------------------------| javax.swing.JComponent | -------------------------| ---------------------------|javax.swing.AbstractButton| ---------------------------| -----------------------| | ---------------------------------------------|javax.swing.JButton| |javax.swing.ToggleButton| ---------------------------------------------| ----------------------| | ----------------------- -------------------------|javax.swing.JCheckBox| |javax.swing.JRadioButton| ----------------------- --------------------------

4.2.1

JButton

E um dos componentes mais familiares e intuitivos ao usurio. Os botes a o de comando so criados com a classe JButton e seu pressionamento gea ralmente dispara a ao especicada em seu rtulo, que tambm suporta a ca o e exibio de ca cones. Tambm podemos denir dicas de ferramenta para cada e boto, juntamente com mnemnicos, que do acesso rpido pelo teclado aos a o a a comandos denidas nos botes. Para oferecer maior interatividade visual o com a GUI, o JButton oferece a possibilidade de cones rollover, os quais 41

mudam de aparncia quando o cursor e posicionado sobre eles, dando a ene tender que o seu pressionamento resulta em uma ao [1]. Deve-se ter a ca mesma ateno com os arquivos de imagem, de acordo com o que foi mencica oando anteriormente. Pressionar um JButton gera eventos ActionEvent que, juntamente com outros eventos, sero abordados mais a frente. a

Figura 4.2: Interface do exemplo que usa JButton

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

// Demonstra a classe JButton import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJButton extends JFrame { private JTextField campo1, campo2; private JLabel nome, sobrenome; private JButton botao1, botao2; // configura a GUI public TesteJButton() { super( "Testando JButtons" ); Container container = getContentPane(); container.setLayout( new FlowLayout() ); nome = new JLabel("Nome"); nome.setToolTipText("Escreva seu nome no campo ao lado"); container.add( nome ); // constri campo de texto com a dimens~o do argumento o a campo1 = new JTextField( 15 ); container.add( campo1 ); sobrenome = new JLabel("Sobrenome"); sobrenome.setToolTipText("Escreva seu sobrenome no campo ao lado"); container.add( sobrenome ); // constri campo de texto com a dimens~o do argumento o a campo2 = new JTextField( 15 ); container.add( campo2 ); // instancia o bot~o1 com o rtulo "Adicionar" a o JButton botao1 = new JButton("Adicionar"); // configura a tecla "A" como acesso rpido pelo teclado ao comando a botao1.setMnemonic(KeyEvent.VK_A);

42

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

// configura a dica de ferramenta botao1.setToolTipText("Une o Nome ao Sobrenome"); container.add(botao1); Icon erase1 = new ImageIcon("figuras/erase1.png"); Icon erase2 = new ImageIcon("figuras/erase2.png"); // instancia o bot~o2 com o rtulo e um cone a o JButton botao2 = new JButton("Apagar", erase1); // configura o botao2 com a capacidade de intuir o pressionamento botao2.setRolloverIcon(erase2); // configura a tecla "P" como acesso rpido pelo teclado ao comando a botao2.setMnemonic(KeyEvent.VK_P); // configura a dica de ferramenta botao2.setToolTipText("Limpa os campos Nome e Sobrenome"); container.add(botao2); // registra tratador de eventos botao1.addActionListener( // cria o objeto que trata o evento de acordo com a defini~o ca // de actionPerformed new ActionListener(){ public void actionPerformed ( ActionEvent evento ){ JOptionPane.showMessageDialog(null,"Seu nome completo : " + e campo1.getText() + campo2.getText()); // retorna os textos // dos campos } } ); // registra tratador de eventos botao2.addActionListener( // cria o objeto que trata o evento de acordo com a defini~o ca // de actionPerformed new ActionListener(){ public void actionPerformed ( ActionEvent evento ){ campo1.setText(" "); // configura os campos com String vazio campo2.setText(" "); repaint(); } } ); setSize( 525, 125 ); setVisible( true ); } // executa a aplicacao public static void main( String args[] ) { TesteJButton aplicacao = new TesteJButton(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

43

4.2.2

JCheckBox

A classe JCheckBox d suporte ` criao de botes com caixa de marcao, a a ca o ca sendo que qualquer nmero de itens pode se selecionado. Quando um item u selecioando, um ItemEvent gerado. O mesmo pode ser tratado por um e e objeto que implemente a interface ItemListener. A classe que fornece as funcionalidades para este objeto deve denir o mtodo itemStateChanged, e mas isso ser visto mais tarde no prximo cap a o tulo. Encaminhe-se para o nosso exemplo que discute as JCheckBox e voc e ver que ele verica qual das caixas foi selecionada para, posteriormente, ina crementar a varivel soma com o valor respectivo de cada caixa de marcao. a ca Usamos o mtodo isSelected(), que retorna verdadeiro caso o item esteja e selecionado, para tal nalidade.

Figura 4.3: Interface do exemplo que usa JCheckBox

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

// Testa bot~es de caixas de marca~o o ca import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJCheckBox extends JFrame { private JTextField campo; private JCheckBox cinco, sete, treze;

// configura a GUI public TesteJCheckBox() { // texto da barra de ttulo super( "Teste de JCheckBox" ); // obtm painl de contedo e e u Container container = getContentPane(); // e configura o leiaute container.setLayout( new FlowLayout() ); // configura a JTextField e sua fonte campo = new JTextField( "Este campo ir exibir a soma dos " + a "valores marcados", 30 ); campo.setFont( new Font( "Serif", Font.PLAIN, 14 ) ); campo.setEditable(false); container.add( campo ); // anexa ao painl de contedo e u // cria as caixas de marca~o e define os caracteres mnem^nicos ca o cinco = new JCheckBox( "Cinco" ); cinco.setMnemonic(KeyEvent.VK_C);

44

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

container.add( cinco ); // anexa ao painl de contedo e u sete = new JCheckBox( "Sete" ); sete.setMnemonic(KeyEvent.VK_S); container.add( sete ); // anexa ao painl de contedo e u treze = new JCheckBox( "Treze" ); treze.setMnemonic(KeyEvent.VK_T); container.add( treze ); // anexa ao painl de contedo e u // registra os ouvintes para as caixas de marca~o ca TratadorCheckBox trat = new TratadorCheckBox(); cinco.addItemListener( trat ); sete.addItemListener( trat ); treze.addItemListener( trat ); // dimensiona a janela e a exibe setSize( 350, 100 ); setVisible( true ); } // executa a aplica~o ca public static void main( String args[] ) { TesteJCheckBox aplicacao = new TesteJCheckBox(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // classe interna privativa que trata de eventos ItemListener private class TratadorCheckBox implements ItemListener { // responde aos eventos das caixas de marca~o ca public void itemStateChanged( ItemEvent evento ) { int soma = 0; // processa evento da caixa de marca~o "Cinco" ca if ( cinco.isSelected() ) soma = soma + 5; // processa evento da caixa de marca~o "Sete" ca if ( sete.isSelected() ) soma = soma + 7; // processa evento da caixa de marca~o "Treze" ca if ( treze.isSelected() ) soma = soma + 13; // configura texto da JTextField campo.setText("A soma acumulada : " + soma); e } } }

4.2.3

JRadioButton

Os botes de opo, que so denidos na classe JRadioButton, assemelhamo ca a se `s caixas de marcao no que concerne aos seus estados (selecionado ou a ca 45

no selecionado). Entretando, costumeiramente so usados em grupo no qual a a apenas um boto de opo pode ser marcado, forando os demais botes ao a ca c o estado no-selecionado. a Nosso exemplo, que realiza uma funo muito elementar, mudar a cor de ca um JTextField baseado na marcao de um grupo de JRadioButton, requer ca que somente uma opo seja selecionada dentre as vrias oferecidas. Para ca a criarmos o relacionamento lgico que acarreta essa funcionalidade usamos o um objeto ButtonGroup, do pacote javax.swing, que em si no um coma e ponente GUI. Ele no exibido na interface grca com o usurio, porm sua a e a a e funcionalidade destacada no momento em que torna as opes mutuamente e co exclusivas. Os mtodos aqui utilizados pouco diferem dos da classe anterior, sendo e que a unica novidade o mtodo getSource( ), que retorna a fonte geradora e e do evento, ou seja, um dos botes rotulados com o nome das cores Amarelo, o Azul ou Vermelho.

Figura 4.4: Interface do exemplo que usa JRadioButton

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

// Testa bot~es de caixas de marca~o o ca import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJRadioButton extends JFrame { private JTextField campo; private JRadioButton amarelo, vermelho, azul; private ButtonGroup onlyOne; // configura a GUI public TesteJRadioButton() { // texto da barra de ttulo super( "Teste de JRadioButton" ); // obtm painl de contedo e e u Container container = getContentPane(); // e configura o leiaute container.setLayout( new FlowLayout() ); // configura a JTextField e sua fonte campo = new JTextField( "Este campo ir mudar de cor", 25 ); a campo.setFont( new Font( "Serif", Font.PLAIN, 14 ) ); container.add( campo ); // cria as caixas de marca~o ca

46

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

amarelo = new JRadioButton( "Amarelo" ); container.add( amarelo ); vermelho = new JRadioButton( "Vermelho" ); container.add( vermelho ); azul = new JRadioButton( "Azul" ); container.add( azul ); // cria um bot~o "virtual" que permite somente a // a marca~o de uma nica caixa ca u onlyOne = new ButtonGroup(); onlyOne.add(amarelo); onlyOne.add(vermelho); onlyOne.add(azul); // registra os ouvintes para as caixas de marca~o ca TratadorRadioButton trat = new TratadorRadioButton(); amarelo.addItemListener( trat ); vermelho.addItemListener( trat ); azul.addItemListener( trat ); setSize( 285, 100 ); setVisible( true ); } // executa a aplica~o ca public static void main( String args[] ) { TesteJRadioButton aplica~o = new TesteJRadioButton(); ca aplica~o.setDefaultCloseOperation( ca JFrame.EXIT_ON_CLOSE ); } // classe interna privativa que trata de eventos ItemListener private class TratadorRadioButton implements ItemListener { private Color cor ; // responde aos eventos das caixas de marca~o ca public void itemStateChanged( ItemEvent evento ) { // processa evento da caixa de marca~o "Vermelho" ca if ( evento.getSource() == vermelho ) cor = Color.red; // processa evento da caixa de marca~o "Amarelo" ca if ( evento.getSource() == amarelo ) cor = Color.yellow; // processa evento da caixa de marca~o "Azul" ca if ( evento.getSource() == azul ) cor = Color.blue; campo.setBackground(cor); } } }

47

4.3

JTextField

Compreende a rea de uma unica linha que suporta a insero ou exibio a ca ca de texto. Podemos denir se o texto pode ser manipulado com o mtodo e setEditable(boolean), utilizando no argumento o valor true. Quando o usurio digita os dados em uma JTexField e pressiona Enter, a ocorre um evento de ao. Esse evento processado pelo ouvinte de evento ca e registrado que pode usar os dados que esto no JTexField no momento em a 1 que o evento ocorre . Nosso exemplo implementa diversos campos de texto com um evento associado a cada um deles.

Figura 4.5: Interface do exemplo que usa JTextField

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

// Demonstra a classe JTextField. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJTextField extends JFrame { private JTextField campo1, campo2, campo3, campo4; private JPasswordField campoDaSenha; private JLabel nome, sobrenome; // configura a GUI public TesteJTextField() { super( "Testando JTextField e JPasswordField" ); Container container = getContentPane(); container.setLayout( new FlowLayout() ); nome = new JLabel("Nome"); nome.setToolTipText("Escreva seu nome no campo ao lado"); container.add( nome ); // constri campo de texto com a dimens~o do argumento o a campo1 = new JTextField( 15 ); container.add( campo1 ); sobrenome = new JLabel("Sobrenome"); sobrenome.setToolTipText("Escreva seu sobrenome no campo ao lado"); container.add( sobrenome );
1

Julgamos didtico a insero gradual do assunto que veremos mais detalhadamente a ca no prximo cpitulo. o a

48

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

// constri campo de texto com a dimens~o do argumento o a campo4 = new JTextField( 15 ); container.add( campo4 ); // constri campo de texto dimensionado pelo String do argumento o campo2 = new JTextField( "<- O tamanho desse campo determinado" + e " pelo texto que est digitado ->" ); a container.add( campo2 ); // constri campo de texto n~o editvel com o String do argumento o a a campo3 = new JTextField( "Esse texto n~o editvel", 25 ); a e a campo3.setEditable( false ); container.add( campo3 ); // constri campo de texto usado para digita~o de senhas com o ca // a dimens~o do argumento a campoDaSenha = new JPasswordField( 10 ); container.add( campoDaSenha ); // registra tratadores de eventos TratadorTextField trat = new TratadorTextField(); campo1.addActionListener( trat ); campo2.addActionListener( trat ); campo3.addActionListener( trat ); campo4.addActionListener( trat ); campoDaSenha.addActionListener( trat ); setSize( 525, 125 ); setVisible( true ); } // executa a aplicacao public static void main( String args[] ) { TesteJTextField applicacao = new TesteJTextField(); applicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // classe privativa interna para tratamento de eventos private class TratadorTextField implements ActionListener { // identifica o campo de texto responsvel pelo evento e, a // em cada caso, o trata public void actionPerformed( ActionEvent evento ) { String output = ""; // usurio pressionou Enter no JTextField campo1 a if ( evento.getSource() == campo1 ) output = "no campo1: " + evento.getActionCommand(); // usurio pressionou Enter no JTextField campo2 a else if ( evento.getSource() == campo2 ) output = "no campo2: " + evento.getActionCommand(); // usurio pressionou Enter no JTextField campo3 a else if ( evento.getSource() == campo3 )

49

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

output = "no campo3: " + evento.getActionCommand(); else if ( evento.getSource() == campo4 ) output = "no campo4: " + evento.getActionCommand(); // usurio pressionou Enter no JPasswordField a else if ( evento.getSource() == campoDaSenha ) { if((new String(campoDaSenha.getPassword())). equals( new String("Swing"))){ output = "a senha correta, Parabns!"; e } else output = "uma Senha Invlida!"; a } JOptionPane.showMessageDialog(null, "Voc^ digitou " + output); e } } }

4.4

JPasswordField

E uma subclasse de JTextField e acrescenta vrios mtodos espec a e cos para o processamento de senhas. Sua aparncia e comportamento quase e nada diferem de uma JTextField, a no ser quando o texto digitado, pois a e o mesmo ca ocultado pelos asteriscos. Tal procedimento se justica para ocultar os caracteres inseridos, dado que esse campo contm uma senha. e Sua aparncia pode ser vista na regio inferior da interface do exemplo que e a demonstra JTextField.

4.5

JTextArea

E uma rea dimensionvel que permite que mltiplas linhas de texto a a u sejam editadas com a mesma fonte. Esta classe herdada de JTextCome ponent, que dene mtodos comuns para JTextField, JTextArea e outros e elementos GUI baseados em texto. As JTextAreas no tm eventos de ao como os objetos da classe JTexta e ca Field, cujo o pressionamento de Enter gera um evento. Ento, utiliza-se um a outro componente GUI (geralmente um boto) para gerar um evento externo a que sinaliza quando o texto de uma JTextArea deve ser processado. Se desejarmos recongurar a fonte de uma JTextArea, devemos criar um novo objeto fonte, como demonstrado nesse exemplo:
1

setFont(new Font("Serif", Font.ITALIC, 16));

Podemos congurar um texto com setText(String) ou acrescentar texto com o mtodo append (String). Para evitar que um longo texto die gitado que incluso em somente uma linha, usamos o mtodo setLinee Wrap(boolean), que dene a quebra da linha quando o texto alcanar a c borda da JTextArea. Porm, as palavras podem car quebradas, com cae racteres em uma linha e outros na prxima, sem nenhum compromisso com o as normas gramaticais. Uma maneira de sanar paliativamente esse problema invocar o mtodo setWrapStyleWord(boolean), o qual determina que e e 50

Figura 4.6: Interface do exemplo que usa JTextArea

a mudana de linha seja denida pelas palavras. Em nosso exemplo, usamos c esses dois mtodos passando no argumento de ambos um valor true. e Tambm vale-se de uma JTextArea como argumento para um dilogo e a de mensagem, caso seja necessrio exibir longas sa a das baseadas em texto. Assim, a caixa de mensagem que exibe a JTextArea determina a largura e a altura da area de texto, com base no String que ela contm. No construtor e JTextArea (int, int), podemos denir o tamanho da rea de texto passando a como argumento, respectivamente, o nmero de linhas e colunas. u
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

// Demostra funcionalidades das JTextArea import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJTextArea extends JFrame { private JTextArea areaTexto1, areaTexto2; private JButton copiar, apagar; private String selecionado; // configura a GUI public TesteJTextArea() { // texto da barra de ttulo super( "Testando JTextArea" ); // cria uma caixa vertical para anexar os bot~es e os textos o Box caixaTextos = Box.createVerticalBox(); Box caixaBotoes = Box.createVerticalBox(); String textoDefault = "Este texto pode ser copiado para a JTextArea " + "abaixo. Aqui possvel manipul-lo, pois o mtodo " + e a e "setEditable( boolean ) configurado true como default." + e " J na rea abaixo, o mtodo recebe valor false e n~o "+ a a e a "podemos editar o texto.Digite nesse campo e veja que as "+ "quebras de linhas ocorrem no final das palavras"; // configura a areaTexto1 com 13 linhas e 15 colunas visveis areaTexto1 = new JTextArea( textoDefault, 13, 15 ); // configura mudana automtica de linha c a

51

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

areaTexto1.setLineWrap(true); // determina que as mudana de linha seja definida pelas palavras c areaTexto1.setWrapStyleWord(true); //acrescenta barras de rolagem ` rea de texto a a caixaTextos.add( new JScrollPane(areaTexto1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ) ); // configura o bot~o "Copiar" a copiar = new JButton( "Copiar" ); // registra o bot~o "Copiar" como tratador de eventos a copiar.addActionListener( // classe interna an^nima que trata os eventos do bot~o "Copiar" o a new ActionListener() { // exibe o texto selecioando da "areaTexto1" na "areaTexto2" public void actionPerformed( ActionEvent evento ) { selecionado = areaTexto1.getSelectedText(); // testa se algo foi selecionado if(selecionado != null){ areaTexto2.setText(areaTexto1.getSelectedText()); selecionado = null; } else{ JOptionPane.showMessageDialog(null, "Selecione algum texto!", "Aviso", JOptionPane.INFORMATION_MESSAGE); } } } ); // anexa o bot~o copiar a caixa a caixaBotoes.add( copiar ); // configura o bot~o "Apagar" a apagar = new JButton( "Apagar" ); // registra o bot~o "Apagar" como tratador de eventos a apagar.addActionListener( // classe interna an^nima que trata os eventos do bot~o "Apagar" o a new ActionListener() { // apaga o texto da "areaTexto2" public void actionPerformed( ActionEvent evento ) { areaTexto2.setText( " " ); } } ); // anexa o bot~o apagar a caixa a caixaBotoes.add( apagar ); // configura a areaTexto2 areaTexto2 = new JTextArea( 13, 15 );

52

91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

// configura mudana automtica de linha c a areaTexto2.setLineWrap(true); // restringe a manilupa~o do texto da areaTexto2 ca areaTexto2.setEditable( false ); // determina que as mudana de linha seja definida pelas palavras c areaTexto2.setWrapStyleWord(true); caixaTextos.add( new JScrollPane( areaTexto2 ) ); // obtm painel de contedo e u Container container = getContentPane(); // anexa e posiciona as caixas de texto no centro do conteiner container.add( caixaTextos,BorderLayout.CENTER ); // anexa posiciona a caixa de botoes no lado oeste do conteiner container.add( caixaBotoes,BorderLayout.WEST ); setSize( 547, 200 ); setVisible( true ); } // executa a aplicacao public static void main( String args[] ) { TesteJTextArea aplicacao = new TesteJTextArea(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

4.6

JScrollPane

Objetos dessa classe fornecem a capacidade de rolagem a componentes da classe JComponent, quando estes necessitam de mais espao para exibir c dados. JScrollpane (Component, int, int) o construtor mais elaborado e e recebe um componente (JTextArea por exemplo) como primeiro argumento, denindo qual ser o cliente do JScrollPane, ou seja, para que membro ser a a fornecido as barras de rolagem. Os dois prximos argumentos denem o o comportamento da barra vertical e da horizontal, respectivamente. Para isso, podemos fazer uso das constantes denidas na interface ScrollPaneConstants que implementada por JScrollPane. Vejamos elas [1]: e JScrollPane.VERTICAL SCROLLBAR AS NEEDED JScrollPane.HORIZONTAL SCROLLBAR AS NEEDED Indicam que as barras de rolagem devem aparecer somente quando necessrio. a JScrollPane.VERTICAL SCROLLBAR ALWAYS JScrollPane.HORIZONTAL SCROLLBAR ALWAYS Indicam que as barras de rolagem devem aparecer sempre. JScrollPane.VERTICAL SCROLLBAR NEVER JScrollPane.HORIZONTAL SCROLLBAR NEVER Indicam que as barras de rolagem nunca devem aparecer. 53

E poss congurar o comportamento do JScrollPane para um objeto vel com os mtodos setVerticalScrollBarPolicy(int) e setHorizontalScrolle BarPolicy(int), valendo-se das mesma contantes como argumentos. Como voc j deve ter visto, em muitos exemplos j zemos uso dessa e a a classe, o que nos exime de implementar um exemplo espec co para um componente to conhecido e sem predicativos merecedores de ateno especial. a ca

4.7

JSlider

E um marcador que desliza entre um intervalo de valores inteiros, podendo selecionar qualquer valor de marca de medida em que o marcador repouse. Uma das inmeras utilidades desse controle deslizante restringir os valores u e de entrada em um aplicativo, evitando que o usurio informe valores que a causem erros. Os JSlider comportam a exibio de marcas de medidas principais, seca cundrias e rtulos de medida. A aderncia `s marcas (snap to ticks) possia o e a bilita ao marcador aderir ` marca mais prxima, quando este situar-se entre a o dois valores. Este componente responde `s interaes feitas pelo mouse e pelo teclado a co (setas, PgDn, PgUp, Home e End). Sua orientao pode ser horizontal, ca na qual o valor m nimo est situado na extrema esquerda, ou vertical, na a qual o valor m nimo est situado na extremidade inferior. As posies de a co valor m nimo e mximo podem ser invertidas, valendo-se do mtodo setIna e vert(boolean), com um argumento true.

Figura 4.7: Interface do exemplo que usa JSlider

1 2 3 4 5 6 7 8 9 10 11

// Demonstra funcionalidades do JSlider import import import import import java.awt.*; java.awt.event.*; java.text.DecimalFormat; javax.swing.*; javax.swing.event.*;

public class TesteJSlider extends JFrame { private JSlider slider; private JTextField campo = new JTextField("");

54

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

DecimalFormat valor = new DecimalFormat("000"); // configura a GUI public TesteJSlider() { super( "Testando o JSlider" ); // configura o JSlider para "trabalhar" com valores entre 0 e 100 // o valor inicial 25 e slider = new JSlider( SwingConstants.HORIZONTAL, 0, 100, 25 ); // o intervalo entre as marcas principais 10 e slider.setMajorTickSpacing( 10 ); // o intervalo entre as marcas secundrias 5 a e slider.setMinorTickSpacing(5); // exibe as marcas de medidas slider.setPaintTicks( true ); // exibe o valor das medidas slider.setPaintLabels( true ); // configura a fonte a ser exibida no campo campo.setFont(new Font("Monospaced",Font.BOLD,35)); // dimensiona o campo campo.setSize(100,50); // obtm o valor inicial do marcador do JSlider e o exibe num campo e campo.setText(valor.format( slider.getValue( ) )); // registra o ouvinte de eventos do JSlider slider.addChangeListener( // classe interna an^nima que trata os eventos do JSlider o new ChangeListener() { // trata a mudana de valor decorrente do deslize do marcador c public void stateChanged( ChangeEvent e ) { campo.setText(valor.format( slider.getValue( ) )); } } ); // obtm painel de contedo e u Container container = getContentPane(); // anexa os componentes ao container container.add( slider, BorderLayout.SOUTH ); container.add( campo, BorderLayout.NORTH ); setSize( 250, 200 ); setVisible( true ); }

55

71 72 73 74 75 76 77 78 79

// executa a aplica~o ca public static void main( String args[] ) { TesteJSlider aplicacao = new TesteJSlider(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

4.8

JComboBox

Assemelha-se a um boto, porm, quando clicado, abre uma lista de a e poss veis valores ou opes. Mais precisamente uma caixa de combinao co e ca que permite ao usurio fazer uma seleo a partir de uma lista de itens. a ca Atende-se para que a lista da caixa de combinao, quando aberta, no ulca a trapasse os limites da janela da aplicao. ca Tambm poss digitar nas linhas de uma caixa de combinao. Elas e e vel ca so implementadas com a classe JComboBox, herdada de JComponent. a Tais caixas de combinao geram ItemEvents, assim como as JCheckBoxes. ca

Figura 4.8: Interface do exemplo que usa JComboBox

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

// Demonstra o uso de uma JComboBox para // selecionar uma figura import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJComboBox extends JFrame { private JComboBox comboBox, comboBoxEdit; private JLabel rotulo; private JPanel esquerdo, direito; private String nomes[] = {"Wanderson","Leonardo", "Gabriel","Daniel"}; private String nomesDasFiguras[] = { "figuras/seta_360.gif", "figuras/seta_90.gif", "figuras/seta_180.gif", "figuras/seta_270.gif" }; private Icon figuras[] = {new new new new // configura a GUI ImageIcon(nomesDasFiguras[ ImageIcon(nomesDasFiguras[ ImageIcon(nomesDasFiguras[ ImageIcon(nomesDasFiguras[ 0 1 2 3 ]), ]), ]), ])};

56

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

public TesteJComboBox() { super( "Testando uma JComboBox" ); // obtm painl de contedo e e u Container container = getContentPane(); // e configura seu leiaute container.setLayout( new GridLayout(1,2) ); // cria a JComboBox comboBox = new JComboBox(nomesDasFiguras ); // configura a JComboBox para, quando clicada, // exibir 3 linhas comboBox.setMaximumRowCount( 3 ); // configura a JComboBox para exibir a figura de // indice 2 do array nomeDasFiguras comboBox.setSelectedIndex( 2 ); comboBoxEdit = new JComboBox( nomes ); comboBoxEdit.setEditable(true); // registra tratador de eventos comboBox.addItemListener( // classe interna an^nima para tratar eventos o // da JComboBox new ItemListener() { // trata os eventos da JComboBox public void itemStateChanged( ItemEvent evento ) { // determina se a caixa de marca~o est selecionada ca a if ( evento.getStateChange() == ItemEvent.SELECTED ) rotulo.setIcon( figuras[comboBox.getSelectedIndex() ] ); } } ); comboBoxEdit.addItemListener( // classe interna an^nima para tratar eventos da JComboBox o new ItemListener() { // trata os eventos da JComboBox public void itemStateChanged( ItemEvent evento ) { // determina se a caixa de marca~o est selecionada ca a if ( evento.getStateChange() == ItemEvent.SELECTED ) { JOptionPane.showMessageDialog(null, "Voc^ selecionou : " +(comboBoxEdit.getSelectedItem()) ); e } } } );

57

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

// configura o JLabel para mostrar as figuras rotulo = new JLabel( figuras[ 0 ] ); // anexando componentes ao painel esquerdo esquerdo = new JPanel(); esquerdo.setLayout( new BorderLayout() ); esquerdo.add( comboBox, BorderLayout.NORTH ); esquerdo.add( rotulo , BorderLayout.CENTER); container.add(esquerdo); // anexando componentes ao painel direito direito = new JPanel(); direito.setLayout( new BorderLayout() ); direito.add( comboBoxEdit , BorderLayout.NORTH); container.add(direito); setSize( 350, 150 ); setVisible( true ); } // executa a aplicacao public static void main( String args[] ) { TesteJComboBox aplicacao = new TesteJComboBox(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

4.9

JList

Exibe em uma coluna uma srie de itens que podem ser selecionados. A e classe JList suporta listas em que o usurio pode selecionar apenas um item a e listas de seleo mltipla, permitindo que um nmero qualquer de itens seja ca u u selecionado. Fazemos uso do mtodo setSelectionMode(ListSelectionMode) e para denir isso. A classe ListSelectionMode, do pacote javax.swing, fornece as seguintes constantes que podem ser usadas como argumento do mtodo precedente: e ListSelectionMode.SINGLE SELECTION congura lista de seleo unica; ca ListSelectionMode.SINGLE INTERVAL SELECTION permite seleo ca de itens cont guos, ou seja, um logo abaixo do outro; ListSelectionMode.MULTIPLE INTERVAL SELECTION uma lista e de seleo mltipla que no restringe os itens que podem ser selecionaca u a dos. Os itens que sero exibidos por uma lista podem ser passados como ara gumento no momento da inicializao. A classe JList fornece construtores ca que recebem Vectors e arrays como argumentos. Se voc inicializar uma e lista com um array ou vetor, o construtor implicitamente cria uma lista modelo default. Ela imutvel, ou seja, voc no poder adicionar, remover ou e a e a a 58

sobrescrever os itens. Para criar uma lista onde os itens possam ser modicados, devemos congurar o modelo de lista chamando o mtodo setMoe del(ListModel). Para o mesmo propsito, tambm poss instanciar um o e e vel objeto de uma classe de lista mutvel, como DefaultListMode, adicionar a elementos a ele, para depois passa-lo como argumento do construtor de JList. Vejamos um exemplo:
1 2 3 4 5 6 7

modeloLista = new DefaultListModel(); modeloLista.addElement("Um"); modeloLista.addElement("Dois"); modeloLista.addElement("Tr^s"); e listaNumeros = new JList(modeloLista);

Figura 4.9: Interface do exemplo que usa JList

Atende-se para uma decincia das JList, pois elas no fornecem barras e a de rolagem caso haja mais itens na lista que o nmero de linhas vis u veis. Contornamos isso usando um objeto JScrollPane. Muitas operaes de uma lista so gerenciadas por outros objetos. Por co a exemplo, os itens so gerenciados por um objeto list model, a seleo por a ca um list selection model. Na maioria das vezes, voc no precisa se preocupar e a com os modelos porque JList os cria se necessrio e voc interage com eles a e implicitamente com os mtodos convenientes de JList. e Em nosso aplicativo de exemplo, fazemos o uso das duas listas, sendo que a de seleo unica congura a cor de uma regio da janela valendo-se do ca a mtodo getSelectedIndex(), que devolve um inteiro referente ` posio do e a ca item selecionado no array. J a seleo mltipla permite que seus itens selea ca u cionados sejam exibidos numa outra lista abaixo dela. Utilizamos os mtodos e setListData(Object[ ]) e getSelectedValues( ) para obter essa funcionalidade. Consulte os outros mtodos dessa classe para saber que outros tipos e de informaes podem ser retornadas, tal como valor mximo e m co a nimo dos ndices de uma seleo de itens, dentre outros. ca

59

Denimos a largura de uma lista com o mtodo setFixedCellWidth(int) e e a altura de cada item com setFixedCellHeight(int), que recebem no argumento um inteiro que representa o nmero de pixels. u Salientamos que uma lista de seleo mltipla no tem um evento esca u a pec co associado ` seleo de mltiplos itens. Assim como para objetos a ca u JTextArea, devemos criar outro componente (um boto por exemplo) para a gerar um evento externo e processar os itens selecionados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

// Demonstra funcionalidades da JList import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class TesteJList extends JFrame { private JList listaDeCores, listaSelecionavel, listaDeTexto; private Container container; private JPanel direita, esquerda; private String nomeDasCores[] = { "Preto", "Azul", "Azul Claro", "Cinza Escuro", "Cinza", "Verde", "Cinza Claro", "Magenta", "Laranja", "Rosa", "Vermelho", "Branco", "Amarelo" }; private Color cores[] = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow }; // configura a GUI public TesteJList() { super( "Testando JList" ); // obtm painel de contedo e u container = getContentPane(); // e configura o layout container.setLayout( new GridLayout(1,2) ); esquerda = new JPanel(); esquerda.setLayout(new BorderLayout()); direita = new JPanel(); direita.setLayout(new BorderLayout()); // cria uma lista com itens do array "nomeDasCores" listaSelecionavel = new JList( nomeDasCores ); // determina o nmero de itens visveis na lista u listaSelecionavel.setVisibleRowCount( 5 ); // especifica o modo de sele~o na lista ca listaSelecionavel.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // cria uma lista listaDeTexto = new JList( );

60

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

// determina o nmero de itens visveis na lista u listaDeTexto.setVisibleRowCount( 5 ); // configura a largura da lista "listaDeTexto" listaDeTexto.setFixedCellWidth(10); // configura a altura da lista "listaDeTexto" listaDeTexto.setFixedCellHeight(10); // cria uma lista com itens do array "nomeDasCores" listaDeCores = new JList( nomeDasCores ); // especifica o modo de sele~o na lista ca listaDeCores.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); // determina o nmero de itens visveis na lista u listaDeCores.setVisibleRowCount( 5 ); // adiciona aos painis as JList, juntamente com e // seus JScrollPane esquerda.add( new JScrollPane(listaDeCores), BorderLayout.NORTH ); direita.add( new JScrollPane(listaDeTexto), BorderLayout.CENTER ); direita.add( new JScrollPane(listaSelecionavel), BorderLayout.NORTH ); // anexa os painis ao container e container.add(esquerda); container.add(direita); // configura tratador de eventos da "listaSelecionavel" listaSelecionavel.addListSelectionListener( // classe an^nima interna para eventos de o // sele~o de lista ca new ListSelectionListener() { // trata eventos de sele~o de lista ca public void valueChanged( ListSelectionEvent evento ) { // configura os dados da "listaDeTexto" com os itens // selecionados da "listaSelecionavel" listaDeTexto.setListData( listaSelecionavel.getSelectedValues() ); } } ); // configura tratador de eventos da "listaDeCores" listaDeCores.addListSelectionListener( // classe an^nima interna para eventos de sele~o de lista o ca new ListSelectionListener() { // trata eventos de sele~o de lista ca public void valueChanged( ListSelectionEvent evento ) { esquerda.setBackground(

61

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

cores[ listaDeCores.getSelectedIndex() ] ); } } ); setSize( 400, 250 ); setVisible( true ); } // executa a aplicacao public static void main( String args[] ) { TesteJList aplicacao = new TesteJList(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

4.10

JPopupMenus

So menus sens a veis ao contexto, ou seja, em virtude da localizao do ca cursor do mouse, um clique no boto direito do mesmo dispara um evento a que abre um menu utuante. Tal menu fornece opes selecionveis ao deco a terminado componente por sobre o qual o evento de diparo foi gerado. Em nosso exemplo, dividimos a rea do aplicativo em cinco regies, sendo a o que cada uma pode ser pintada com uma das cores oferecidas pelas opes co do JPopupMenu. Para compormos os itens do menu, usamos um array de JRadioButtonMenuItem, que nada mais so que os botes descritos em 4.2.3, mas agora a o com capacidade de serem incluidos em um menu. Cada item adicionado ao e menu com o mtodo add(JMenuItem) e registra um tratador de eventos e passando como argumento ao mtodo addActionListener (ActionEvent) e um objeto da classe TratadorDeItem. Novamente o relacionamento lgico o que cola os botes e s permite que um seja selecionado criado com um o o e objeto ButtonGroup. Criamos um mtodo chamado vericaEventoDeDisparo(Mouse Event) e que verica se o evento de disparo ocorreu. Para isso, utilizamos o mtodo e isPopupTrigger( ), de MouseEvent, que retorna verdadeiro se o evento ocorreu, nesse caso, validando a execuo da estrutura condicional posteca rior. Ela chama o mtodo show(Component, int, int) da classe JPopupe Menu, que em seu primeiro argumento especica o componente que originou o evento e nos dois argumentos seguintes dene as coordenadas x e y relativas ao canto superior esquerdo do elemento de origem sobre o qual o menu deve aparecer. Funcionalmente, esse mtodo exibe o canto superior esquerdo do e menu exatamente onde o evento de disparo ocorreu. Tambm criamos o mtodo estou ( int x, int y) que, baseado na posio e e ca onde o cursor do mouse estiver, retorna o componente que se encontra nessa respectiva coordenada.
1 2

// Demonstra o uso do JPopupMenu

62

Figura 4.10: Interface do exemplo que usa JPopupMenu

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJPopupMenu extends JFrame { private JRadioButtonMenuItem itens[]; private Color cores[] = { Color.blue, Color.yellow, Color.red, Color.green, Color.orange }; private private private private JPopupMenu popupMenu; JPanel norte, sul, leste, oeste, centro; int x = 0; int y = 0;

// configura a GUI public TesteJPopupMenu() { super( "Testando JPopupMenu" ); TratadorDeItem trat = new TratadorDeItem(); String nomeDasCores[] = { "Azul", "Amarelo", "Vermelho", "Verde", "Laranja" }; // configura o JPopupMenu para selecioanar somente um dos // seus cinco itens ButtonGroup umaCor = new ButtonGroup(); popupMenu = new JPopupMenu(); itens = new JRadioButtonMenuItem[ 5 ]; Container container = getContentPane(); container.setLayout(new BorderLayout()); // constri cada item de menu o for ( int count = 0; count < itens.length; count++ ) { itens[ count ] = new JRadioButtonMenuItem( nomeDasCores[ count ] ); // adiciona os itens ao JPopupMenu e ao bot~o de sele~o nica a ca u popupMenu.add( itens[ count ] ); umaCor.add( itens[ count ] );

63

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

// registra ouvinte de cada item itens[ count ].addActionListener( trat ); } // cria painis e norte = new JPanel(); sul = new JPanel(); leste = new JPanel(); oeste = new JPanel(); centro = new JPanel(); // anexa os paines em suas respectivas regi~es o container.add(norte, BorderLayout.NORTH); container.add(sul, BorderLayout.SOUTH); container.add(leste, BorderLayout.EAST); container.add(oeste, BorderLayout.WEST); container.add(centro, BorderLayout.CENTER); // define um ouvidor para a janela da aplica~o, a qual exibe ca // um JPopupMenu quando ocorre o evento de acionamento do mesmo(right-click) this.addMouseListener( // classe interna an^nima o new MouseAdapter() { para tratar eventos do mouse (right-click)

// trata eventos do pressionamento do mouse public void mousePressed( MouseEvent evento ) { verificaEventoDeDisparo( evento ); } // trata de eventos de libera~o do mouse ca public void mouseReleased( MouseEvent evento ) { verificaEventoDeDisparo( evento ); } // determina se o evento deve acionar private void verificaEventoDeDisparo( { x = evento.getX(); // armazena a y = evento.getY(); // armazena a o JPopupMenu MouseEvent evento ) abcissa ordenada

// devolve true se o disparo do JPopupMenu ocorreu if ( evento.isPopupTrigger() ) { // exibe o JPopupMenu onde ocorreu o disparo do evento popupMenu.show( evento.getComponent(), evento.getX(), evento.getY() ); } } } ); setSize( 300, 200 ); setVisible( true ); } // executa a aplica~o ca public static void main( String args[] )

64

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

{ TesteJPopupMenu aplicacao = new TesteJPopupMenu(); aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // retorna o painel sobre o qual o mouse foi clicado public Component estou ( int valorX , int valorY ) { return findComponentAt( valorX, valorY); } // classe interna an^nima para tratar eventos do mouse (click) o private class TratadorDeItem implements ActionListener { // processa a sele~o de cada item do JPopupMenu ca public void actionPerformed( ActionEvent evento ) { // determina qual item do menu foi selecionado for ( int i = 0; i < itens.length; i++ ) { if ( evento.getSource() == itens[ i ] ) { // pinta o componente (painel) sobre o qual // o mouse foi clicado estou(x,y).setBackground( cores[ i ] ); repaint(); return; } } } } }

4.11

Menus

Muito familiares a ns, o menus talvez sejam os componentes que mais o aparecem nas ferramentas computacionais que utilizamos. Geralmente eles so encontrados no topo da janela da aplicao, de onde do suporte ` ora ca a a ganizao e agrupamento de funes ans em um mesmo contexto visual, o ca co que facilita muito a localizao e entendimento por parte do usurio, j que ca a a a estrutura de cada menu est delineada pelas caracter a sticas dos itens. Os menus, que so instanciados a partir da classe JMenu, so anexados a a a uma barra de menus com o mtodo add(JMenu) de JMenuBar, sendo que e instncias dessa ultima classe comportam-se como conteiners para menus. A a classe JMenuBar fornece os mtodos necessrios ao gerenciamento da barra e a onde os menus so anexados. A ordenao dos mesmos depende da ordem a ca em que foram adicioandos, sendo que so empilhados horizontalmente da a esquerda para a direita. Evidentemente, s podemos anexar menus ` janelas o a da classe JApplet, JDialog, JFrame e JInternalFrame, e fazemos isso usando o mtodo setJMenuBar(JMenuBar). e A classe JMenuItem capacita a criao de itens de menu que, por sua ca vez, devem ser anexados a um menu. Podemos usar um item de menu para 65

executar alguma ao ou para gerir o acionamento de um submenu, o qual ca fornece mais itens que esto relacionados por alguma caracter a stica comum. Veremos isso em nosso exemplo e ainda outras funcionalidades, tais como inserir uma gura, alterar o estilo, a cor da fonte e a prpria fonte de um o rtulo. o Como voc bem sabe, os menus comportam o uso de caracteres mnemnicos e o e os nossos no poderia car para traz. Outra novidade o uso de oba e jetos JCheckBoxMenuItem, que so semelhantes `s caixas de marcao a a ca vistas em 4.2.2, s que aqui aparecem dentro de um menu, e JRadioButo tonMenuItem, que so muito parecidos com os botes de rdio descritos a o a em 4.2.3. Aqui eles tambm encontram-se representando itens de menu de e seleo unica. ca

Figura 4.11: Interface do exemplo que usa JMenu

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

// Demonstra Jmenu import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteJMenu extends JFrame { private Color colorValues[] = { Color.black, Color.blue, Color.red, Color.green }; private private private private private private private JRadioButtonMenuItem itensDasCores[], fontes[]; JCheckBoxMenuItem itensDosEstilos[]; JLabel texto; ButtonGroup umaUnicaFonte, umaUnicaCor; int estilo; Icon carta = new ImageIcon("figuras/carta.gif"); Icon figura1 = new ImageIcon("figuras/logo.jpg");

66

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

// configura a GUI public TesteJMenu() { // configura ttulo da barra de ttulo super("Testando JMenus"); // obtm painl de conteudo e e Container container = getContentPane(); container.setLayout(new FlowLayout()); /*****************MENU ARQUIVO************************/ // configura o menu "Arquivo" e seus itens de menu JMenu menuArquivo = new JMenu("Arquivo"); menuArquivo.setMnemonic(A); JMenuItem itemFigura1 = new JMenuItem("Figura1"); itemFigura1.setMnemonic(F); itemFigura1.addActionListener( // classe interna an^nima para tratar eventos do item de menu "Figura1" o new ActionListener() { // insere uma figura na janela do aplicativo quando o // usurio clica no item "Figura1" a public void actionPerformed(ActionEvent evento) { inserir(); } }); menuArquivo.add(itemFigura1); // configura o item de menu "Sair" JMenuItem itemSair = new JMenuItem("Sair"); itemSair.setMnemonic(S); itemSair.addActionListener( // classe interna an^nima para tratar eventos do item de menu "itemSair" o new ActionListener() { // finaliza o aplicativo quando o usurio clica no a // item "Sair" public void actionPerformed(ActionEvent evento) { System.exit(0); } }); menuArquivo.add(itemSair); /*****************MENU AJUDA************************/ // configura o menu "Ajuda" e seus itens de menu JMenu menuAjuda = new JMenu("Ajuda"); menuAjuda.setMnemonic(H); //configura o item de menu "Universitrios" a JMenuItem itemUniversitarios = new JMenuItem("Universitrios"); a itemUniversitarios.setMnemonic(U); itemUniversitarios.addActionListener(

67

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135

// classe interna an^nima para tratar eventos do item o // de menu "Universitrios" a new ActionListener() { // exibe um dilogo de mensagem quando "Universitrios" a a // selecionado e public void actionPerformed(ActionEvent event) { JOptionPane.showMessageDialog( TesteJMenu.this, "Voc^ n~o um Universitrio?\nEnt~o...", e a e a a "Ajuda", JOptionPane.PLAIN_MESSAGE); } }); menuAjuda.add(itemUniversitarios); // configura o item de menu "Cartas" JMenuItem itemCartas = new JMenuItem("Cartas"); itemCartas.setMnemonic(C); itemCartas.addActionListener( // classe interna an^nima para tratar eventos de item o // de menu "Cartas" new ActionListener() { // exibe um dilogo de mensagem quando "Cartas" a // selecionado e public void actionPerformed(ActionEvent event) { JOptionPane.showMessageDialog( TesteJMenu.this, "N~o deu Sorte!!!", a "Cartas", JOptionPane.PLAIN_MESSAGE, carta); } }); menuAjuda.add(itemCartas); // cria e anexa a barra de menu ` janela TesteJMenu a JMenuBar barra = new JMenuBar(); setJMenuBar(barra); // anexa os menus "Arquivo" e "Ajuda" ` barra de menu a barra.add(menuArquivo); barra.add(menuAjuda); /*****************MENU FORMATAR************************/ // cria o menu Formatar, seus submenus e itens de menu JMenu formatMenu = new JMenu("Formatar"); formatMenu.setMnemonic(r); // cria os nomes do submenu "Cor" String cores[] = { "Preto", "Azul", "Vermelho", "Verde" }; JMenu menuCor = new JMenu("Cor");

68

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194

menuCor.setMnemonic(C); itensDasCores = new JRadioButtonMenuItem[cores.length]; umaUnicaCor = new ButtonGroup(); TratadorDeItens trat = new TratadorDeItens(); // cria itens do menu "Cor" com bot~es de op~o o ca for (int count = 0; count < cores.length; count++) { itensDasCores[count] = new JRadioButtonMenuItem(cores[count]); menuCor.add(itensDasCores[count]); umaUnicaCor.add(itensDasCores[count]); itensDasCores[count].addActionListener(trat); } // seleciona o primeiro item do menu "Cor" itensDasCores[0].setSelected(true); // anexa o menu "menuCor" ao menu "formatMenu" formatMenu.add(menuCor); // insere uma barra separadora formatMenu.addSeparator(); // cria o submenu "Fonte" String nomeDasFontes[] = { "Serif", "Monospaced", "SansSerif" }; JMenu menuFonte = new JMenu("Fonte"); menuFonte.setMnemonic(n); fontes = new JRadioButtonMenuItem[3]; // implementa a exclus~o mtua dos itens a u umaUnicaFonte = new ButtonGroup(); // cria itens do menu "Fonte" com bot~es de op~o o ca for (int count = 0; count < fontes.length; count++) { fontes[count] = new JRadioButtonMenuItem(nomeDasFontes[count]); menuFonte.add(fontes[count]); umaUnicaFonte.add(fontes[count]); // registra o tratador de eventos para os JRadioButtonMenuItens fontes[count].addActionListener(trat); } // seleciona o primeiro item do menu "Fonte" fontes[0].setSelected(true); // insere uma barra separadora menuFonte.addSeparator(); // configura os itens de estilo do menu "Fonte" String estiloNames[] = { "Bold", "Italic" }; itensDosEstilos = new JCheckBoxMenuItem[estiloNames.length]; TratadorDeEstilo estiloHandler = new TratadorDeEstilo();

69

195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253

// cria os itens de estilo do menu for (int count = 0; count < estiloNames.length; count++) { itensDosEstilos[count] = new JCheckBoxMenuItem(estiloNames[count]); menuFonte.add(itensDosEstilos[count]); itensDosEstilos[count].addItemListener(estiloHandler); } // anexa o menu "Fonte" ao menu "Formatar" formatMenu.add(menuFonte); // anexa o menu "Formatar" ` barra de menu a barra.add(formatMenu); // configura o rtulo para exibir o texto o texto = new JLabel("P.E.T. Computa~o", SwingConstants.CENTER); ca texto.setForeground(colorValues[0]); texto.setFont(new Font("TimesRoman", Font.PLAIN, 72)); container.setBackground(Color.white); container.add(texto); setSize(700, 500); setVisible(true); } // insere o logo do PET na janela do aplicativo public void inserir() { JLabel labelFigura1 = new JLabel(); labelFigura1.setIcon(figura1); this.getContentPane().add(labelFigura1); this.repaint(); this.show(); } // executa a aplica~o ca public static void main(String args[]) { TesteJMenu application = new TesteJMenu(); application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } // classe interna an^nima para tratar eventos de a~o o ca // dos itens de menu private class TratadorDeItens implements ActionListener { // processa as sele~es de cor e fonte co public void actionPerformed(ActionEvent evento) { // processa sele~o de cor ca for (int count = 0; count < itensDasCores.length; count++) if (itensDasCores[count].isSelected()) { texto.setForeground(colorValues[count]); break; } // processa sele~o de fonte ca for (int count = 0; count < fontes.length; count++) if (evento.getSource() == fontes[count]) {

70

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

texto.setFont( new Font(fontes[count].getText(), estilo, 72)); break; } repaint(); } } // classe interna an^nima que trata eventos dos itens o // de menu que usam caixa de marca~o ca private class TratadorDeEstilo implements ItemListener { // processa sele~o de estilo das fontes do Label ca public void itemStateChanged(ItemEvent item) { estilo = 0; // verifica se negrito foi selecionado if (itensDosEstilos[0].isSelected()) estilo += Font.BOLD; // verifica se itlico foi selecionado a if (itensDosEstilos[1].isSelected()) estilo += Font.ITALIC; texto.setFont(new Font(texto.getFont().getName(), estilo, 72)); repaint(); } } }

71

Cap tulo 5 Eventos


Eventos so o resultado da interao do usurio com algum componente a ca a GUI. Mover o mouse, clic-lo, digitar num campo de texto, selecionar um a item de menu, fechar uma janela, clicar num boto, etc. so interaes que a a co enviam eventos para o programa, normalmente realizando servios. c Eventos tambm podem ser gerados em resposta a modicaes do ambie co ente, como por exemplo, quando a janela de um applet coberta por outra e janela. Em outras palavras, dene-se eventos GUI como mensagens (chamadas a mtodos) que indicam que o usurio do progama interagiu com um dos e a componentes GUI.

5.1

Tratamento de Eventos

O mecanismo de tratamtendo de eventos compreende trs partes: a orie gem, o objeto e o ouvinte do evento.

5.1.1

A Origem do Evento

E o componente GUI em particular com o qual o usurio interage. a

5.1.2

O Objeto Evento

Dada a interao com algum componente, um objeto evento criado. ca e Ele encapsula as informaes sobre o evento que ocorreu, incluindo uma co referncia para a origem e demais dados necessrios para que o ouvinte do e a evento o trate.

5.1.3

Ouvinte do Evento

E um objeto de uma classe que implementa uma ou mais das interfaces listeners de eventos dos pacotes java.awt.event e javax.swing.event. Ele noticado da ocorrncia de um evento e usa o objeto evento que recebe e e para, de acordo com seus mtodos de tratamento de eventos, responder ao e evento. Para isso o ouvinte deve ser registrado e implementar a interface correspondente ao(s) evento(s) que deseja tratar. Cada fonte de eventos pode ter mais de um ouvinte registrado. Analogmente, um ouvinte pode registrar multiplas fontes de eventos. 72

Basicamente, quando ocorre um evento (precionar um JButton, por exemplo) , o componente GUI com o qual o usurio interagiu notica seus ouvintes a registrados chamando o mtodo de tratamento de evento (como voc ver, e e a o ActionPerformed, nesse caso) apropriado de cada ouvinte. Esse estilo e de progamao conhecido como programao baseada em eventos. ca e ca

5.2

Tratadores de Eventos ou Ouvintes (Listeners)

So objetos de qualquer classe que implemente uma interface espec a ca para o tipo de evento que se deseja tratar. Essa interface denida para cada e classe de eventos. Para a classe de eventos java.awt.eventFocusEvent existe a interface java.awt.eventFocusListener, por exemplo. Vamos explorar esse assunto nestas prximas sees, descrevendo os mtodos denidos o co e 1 por cada interface e em decorrncia de quais aes eles so chamados. e co a

5.2.1

ActionListener

A partir dessa interface, instnciamos objetos que sabem tratar eventos a de ao. ca public void actionPerformed(ActionEvent) Invocado quando clicamos em um boto, pressionamos Enter enquanto a digitamos em um campo de texto ou selecionamos um item de menu.

5.2.2

FocusListener

Trata de eventos de visibilidade, ou seja, quando o componente ca no foco de ao do teclado (primeiro plano), ganhando ou perdendo abilidade ca de receber entradas do mesmo. Os mtodos recebem como argumento um e objeto da classe FocusEvent. public void focusGained(FocusEvent) Chamado somente depois que o componente ganha o primeiro plano de ao. ca public void focusLost(FocusEvent) Chamado somente depois que o componente perde o foco de ao. ca

5.2.3

ItemListener

Compreende eventos relativos a marcao, onde existe a possibilidade do ca estado selecionado e no-selecionado. Por exemplo, as opes de JCheckBox, a co JCheckBoxItem e JCombobox. public itemStateChanged(ItemEvent) Invocado aps o componente soo frer um mudana de estado. c
1

Apresentamos somente as interfaces que julgamos de maior interesse.

73

5.2.4

KeyListener

Aqui apresentaremos a interface listener de eventos KeyListener, que trata dos eventos de pressionamento e liberao das teclas. Uma classe que ca implementa esta interface deve fornecer denio para os mtodos: ca e public void KeyPressed (KeyEvent) Chamado quando se pressiona qualquer tecla. public void KeyReleased (KeyEvent) Chamado quando se libera qualquer tecla. public void KeyTyped (KeyEvent) Chamado quando se pressiona uma tecla de ao ( setas, Home, End, ca Page Up, Page Down) ou de funo (Num Lock, Caps Lock, Scroll Lock, ca Pause, Print Screen). Se quiser ver isso na prtica, compile nosso exemplo: a

Figura 5.1: Interface do exemplo que demonstra as Atividades do Teclado

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

// Demonstra eventos das teclas import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TesteDasAtividadesDoTeclado extends JFrame implements KeyListener { private private private private private String linha1 = ""; String linha2 = ""; String linha3 = ""; JTextArea areaTexto; String teclasDigitadas = "";

// configura a GUI public TesteDasAtividadesDoTeclado() { // texto da barra de ttulo

74

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

super( "Testando eventos das teclas" ); // configura a JTextArea areaTexto = new JTextArea( 10, 15 ); areaTexto.setFont(new Font("Serif", Font.TRUETYPE_FONT, 20)); areaTexto.setText( "Pressione qualquer tecla..." ); areaTexto.setEnabled( false ); areaTexto.setLineWrap( true ); //areaTexto.setBackground(Color.BLUE.brighter()); getContentPane().add( areaTexto ); // registra a janela para processar os eventos de teclas addKeyListener( this ); setSize( 450, 200 ); // dimensiona a janela setVisible( true ); // exibe a janela } // trata o pressionamento de qualquer tecla public void keyPressed( KeyEvent evento ) { linha1 = "Tecla Pressionada: " + evento.getKeyText( evento.getKeyCode() ); configLinha2e3( evento ); teclasDigitadas = teclasDigitadas + evento.getKeyText( evento.getKeyCode()) +", "; } // trata a libera~o de qualquer tecla ca public void keyReleased( KeyEvent evento ) { linha1 = "Tecla Liberada: " + evento.getKeyText( evento.getKeyCode() ); configLinha2e3( evento ); } // trata o pressionamento de uma tecla de a~o ca public void keyTyped( KeyEvent evento ) { linha1 = "Tecla Acionada: " + evento.getKeyChar(); configLinha2e3( evento ); } // configura a segunda e a terceira linha do output private void configLinha2e3( KeyEvent evento ) { linha2 = "Esta tecla " + ( evento.isActionKey() ? "" : "n~o " ) + a " uma tecla de a~o"; e ca String temp = evento.getKeyModifiersText( evento.getModifiers() ); linha3 = "Tecla modificadora pressionada: " + ( temp.equals( "" ) ? "nenhuma" : temp ); areaTexto.setText( linha1 + "\n" + linha2 + "\n" + linha3 + "\n" +"Voc^ digitou essa seq^ncia: " + teclasDigitadas ); e ue

75

79 80 81 82 83 84 85 86 87 88 89 90 91

} // executa a aplica~o ca public static void main( String args[] ) { TesteDasAtividadesDoTeclado aplicacao = new TesteDasAtividadesDoTeclado(); // configura o encerramento da aplica~o ca aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

5.2.5

MouseListener

Agora apresentaremos a interface listener de eventos MouseListener, que trata dos eventos de pressionamento e liberao dos botes do mouse. Uma ca o classe que implementa esta interface deve fornecer denio para os mtodos[1]: ca e public void mousePressed(MouseEvent) Chamado quando se pressiona um boto do mouse com o cursor sobre a um componente. public void mouseClicked(MouseEvent) Chamado quando pressiona-se e libera-se um boto do mouse sobre um a componente, sem mover o cursor. public void mouseReleased(MouseEvent) Chamado quando se libera um boto do mouse depois de ser pressionado. a As chamadas para este mtodo so enviadas para o ouvinte de eventos do e a componente sobre o qual a operao de arrastar iniciou. Esse evento sempre ca precedido por um evento mousePressed. e public void mouseEntered(MouseEvent) Chamado quando o cursor do mouse entra nos limites de um componente. public void mouseExited(MouseEvent) Chamado quando o cursor do mouse sai dos limites de um componente.

5.2.6

MouseMotionListener

A interface listener de eventos MouseMotionListener trata dos eventos de arrasto do mouse. Uma classe que implementa esta interface deve fornecer denio para os mtodos[1]: ca e public void mouseDragged(MouseEvent) 76

Chamado quando se pressiona o boto do mouse com o cursor sobre um a componente e se move o mouse. As chamadas para este mtodo so enviadas e a para o ouvinte de eventos do componente sobre o qual a operao de arrastar ca iniciou. Esse evento sempre precedido por uma chamada mousePressed. e public void mouseMoved(MouseEvent) Chamado quando se move o mouse com o cursor sobre um componente. Os eventos do mouse podem ser capturados por qualquer componente GUI que se derive de java.awt.Component (painis, botes, etc.), sendo que e o o componente deve ter um objeto listener registrado. Todos esses mtodos e recebem um objeto MouseEvent como argumento, o qual encapsula as informaes sobre o evento que ocorreu, incluindo as coordenadas x e y da co posio em que o mesmo vericou-se. Consulte nosso prximo exemplo para ca o solidicar seus conhecimentos:

Figura 5.2: Interface do exemplo que demonstra as Atividades do Mouse

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

// Demonstra eventos do mouse import import import import java.awt.*; java.awt.event.*; javax.swing.*; java.text.DecimalFormat;

public class TesteDasAtividadesDoMouse extends JFrame implements MouseListener, MouseMotionListener { private JLabel estado,labelNumeroClicks,estouEm; private int numeroClicks = 0; private JButton limpar; // configura a GUI public TesteDasAtividadesDoMouse() { // texto da barra de ttulo super( "Testando eventos do Mouse" ); estado = new JLabel();

77

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

labelNumeroClicks = new JLabel(); estouEm = new JLabel(); Container container = getContentPane(); container.add( labelNumeroClicks, BorderLayout.NORTH ); container.add( estado, BorderLayout.SOUTH ); container.add( estouEm, BorderLayout.CENTER ); // a janela do aplicativo espera por seus prprios o // eventos do mouse addMouseListener( this ); addMouseMotionListener( this ); setSize( 275, 200 ); setVisible( true ); } // >>> tratador de eventos MouseListener <<< // trata evento do mouse quando um bot~o liberado a e // imediatamente aps ser pressionado o public void mouseClicked( MouseEvent evento ) { DecimalFormat valor = new DecimalFormat("000"); numeroClicks = numeroClicks + evento.getClickCount(); labelNumeroClicks.setText("Numero de vezes que voc^ clicou: " + e valor.format(numeroClicks)); estado.setText( "Clicado em [" + evento.getX() + ", " + evento.getY() + "]" ); } // trata evento quando um bot~o do mouse pressionado a e public void mousePressed( MouseEvent evento ) { estado.setText( "Pressionado em [" + evento.getX() + ", " + evento.getY() + "]" ); } // trata evento do mouse quando ele liberado aps e o // ser arrastado public void mouseReleased( MouseEvent evento ) { estado.setText( "Liberado em [" + evento.getX() + ", " + evento.getY() + "]" ); } // trata evento do mouse quando ele entra na rea da janela a public void mouseEntered( MouseEvent evento ) { estouEm.setText( "Estou em: " + evento.getComponent().getClass().getName()); labelNumeroClicks.setText( "Mouse dentro da janela" ); } // trata evento do mouse quando ele sai da rea da janela a public void mouseExited( MouseEvent evento ) { estado.setText( "Mouse fora da janela" ); } // dimensiona a janela // exibe a janela

78

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

// >>> tratadores de eventos MouseMotionListener <<< // trata evento quando o usurio arrasta o mouse com a // o bot~o pressionado a public void mouseDragged( MouseEvent evento ) { estado.setText( "Arrastado em [" + evento.getX() + ", " + evento.getY() + "]" ); } // trata evento quando o usurio move o mouse a public void mouseMoved( MouseEvent evento ) { estado.setText( "Movido em [" + evento.getX() + ", " + evento.getY() + "]" ); } // executa a aplica~o ca public static void main( String args[] ) { TesteDasAtividadesDoMouse aplicacao = new TesteDasAtividadesDoMouse(); // configura o encerramento da aplica~o ca aplicacao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }

5.2.7

WindowListener

Todas as janelas geram eventos quando o usurio as manipula. Os ouvina tes (listeners) de eventos so registrados para tratar eventos de janela com a o mtodo addWindowListener(WindowListener) da classe Window. e A interface WindowListener, que implementada por ouvintes de eventos e de janela, fornece sete mtodos para tratar esses eventos, Todos os mtodos e e recebem um objeto da classe WindowEvent. Vejamos eles: public void windowActivated(WindowEvent) Chamado quando o usurio torna uma janela ativa. a public void windowClosed(WindowEvent) Chamado depois que a janela fechada. e public void windowClosing (WindowEvent) Chamado quando o usurio inicia o fechamento da janela. a public void windowDesactivated(WindowEvent) Chamado quando o usurio torna outra janela a ativa. a public void windowIconied(WindowEvent) 79

Chamado quando o usurio minimiza a janela. a public void windowDeiconied(WindowEvent) Chamado quando o usurio restaura uma janela minimiza. a public void windowOpened(WindowEvent) Chamado quando uma janela exibida pela primeira vez na tela. e

5.3

Classes Adaptadoras

A premissa de que uma classe implementa uma interface implica que o programador dever denir todos os mtodos declarados nessa interface. a e Porm, nem sempre desejvel denir todos os mtodos. Podemos conse e a e truir aplicaes que utilizem apenas o mtodo tratator de eventos mouco e seClicked da interface MouseListener, por exemplo. Para muitas das interfaces listeners que contm vrios mtodos, os pacotes java.awt.event e a e e javax.swing.event fornecem classes adaptadoras de ouvintes de eventos. Essas classes implementam uma interface e fornecem cada mtodo implemene tado com um o corpo vazio. O programador pode criar uma classe que herde da classe adaptadora todos os mtodos com a implementao default(corpo e ca vazio) e depois sobrescrever o(s) mtodo(s) necessrio(o) para o tratamento e a de eventos. Vejamos as classes adaptadoras que implementam as respectivas interfaces: Classe Adaptadora ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter Interface ComponentListener ContainerListener FocusListener KeyListener MouseListener

MouseMotionAdapter MouseMotionListener WindowAdapter WindowListener

5.4

Classes Internas Annimas o

Tratadores de eventos podem ser instncias de qualquer classe. Muitas a vezes, se os mesmos possu rem poucas linhas de cdigo, os implementamos o usando um classe interna annima, que denida dentro de outra classe. o e Pode parecer confuso, mas elas permitem que a implementao dos trataca dores de eventos que prxima de onde o tratador de eventos registrado, o e favorecendo a composio de um cdigo compacto. Um objeto da classe inca o terna pode acessar diretamente todas as variveis de instncia e mtodos do a a e 80

objeto da classe externa que o deniu. Voc j deve ter notado que em nossos e a exemplos esse tipo de implementao corriqueiro. ca e Veremos agora como denir uma classe interna annima e criar um objeto o dessa classe, que passado como argumento do mtodo addActionListee e ner(ActionListener). Usa-se a sintaxe especial de Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14

// registra tratador de eventos de algumComponente algumComponente.addActionListener( // classe interna an^nima o new ActionListener(){ public void actionPerformed(actionEvent evento) { ...// aqui vai o cdigo que responde ` a~o o a ca } } ); // fim da classe interna an^nima o

// fim da chamada para addActionListener

Utiliza-se o operador new para criar o objeto. A sintaxe ActionListener( ) comea a denio da classe interna annima que implementa a interc ca o face ActionListener. Os parentses depois de ActionListener indicam uma e chamada ao construtor default da classe interna annima. Isso assemelha-se o ao cdigo sequente: o
1 2 3 4 5 6 7 8

public class TratadorDeAcao implements ActionListener { public void actionPerformed(ActionEvent evento) { ...// aqui vai o cdigo que responde ` a~o o a ca } }

Tambm poss registrar a classe da aplicao como ouvidora de evene e vel ca tos. Nesse caso, os mtodos de tratamento de eventos so declarados no ese a copo da classe da aplicao ou do applet, que por sua vez, deve implementar ca uma interface listener de eventos.

5.5

Como implementar um Tratador de Eventos

Podemos denir uma classe que processe eventos de duas formas: Implementando uma interface (KeyListener, MouseListener, etc.); Extendendo uma classe adaptadora (KeyAdapter, MouseAdapter, etc.). Na declarao da classe tratadora de eventos, o cdigo que especica que ca o a classe implementa uma interface listener o seguinte: e

81

1 2 3 4 5 6 7 8 9

public class UmaClasse implements ActionListener { // cdigo que implementa o mtodo listener da interface: o e public void actionPerformed (ActionEvent evento) { ...// aqui vai o cdigo que responde ` a~o o a ca } }

J o cdigo que representa que uma classe herda de uma outra que ima o plementa uma interface listener : e
1 2 3 4 5 6 7 8 9

public class OutraClasse extends WindowAdapter { // cdigo que implementa o mtodo listener da interface: o e public void windowClosing (WindowEvent evento) { ...// aqui vai o codigo que responde ` a~o a ca } }

O cdigo que registra uma instncia da classe tratadora de eventos como o a ouvidor para um ou mais componentes : e
1 2 3 4 5

algumComponente.addActionListener(objeto da classe UmaClasse); // ou algumComponente.addWindowListener(objeto da classe OutraClasse);

Para recapitular tudo o que vimos at aqui, vamos examinar uma situao e ca t pica de tratamento de eventos, baseado-se em como os JButtons tratam o evento de pressionar o mouse sobre eles. Para detectar quando o usurio clica no componente GUI, o programa a deve fornecer um objeto que implemente a interface ActionListener. Devese registrar este objeto como um ouvinte de ao do boto (que a origem ca a e do evento), valendo-se do mtodo addActionListener(ActionListener). e Quando o usurio clica no JButton, ele dispara um evento de ao. Isto a ca resulta na invocao do mtodo ouvidor de ao actionPerformed (o unico ca e ca da interface ActionListener a ser implementado ). O unico argumento do mtodo um objeto ActionEvent que encapsula informaes sobre o evento e e co e sua origem.

82

Consideraes Finais co
Findado este curso, esperamos ter explicitado de forma agradvel os a tpicos a que nos propomos elucidar. Sabemos que existem muitos outros o componentes que seriam muito bem vindos se alocados nestas pginas, porm a e o assunto se extenderia demasiadamente. Fique claro ao leitor que de interesse do autor incorporar a esse material e um tpico referente ao feedback visual que um usurio espera, em termos de o a cores, estruturao e distribuio de componentes. Assim sendo, se de seu ca ca e interesse, periodicamente consulte a verso online dessa apostila. a Para nalizar, o autor agradece pela ateno dispensada e despedece deca sejando sucesso ao leitor na aplicao desses conhecimentos. ca

83

Referncias Bibliogrcas e a
[1] H. M. Deitel, P. J. Deitel Java Como Programar. Bookman, Quarta Edio, 2003. ca [2] Lisa Friendly, Mary Campione, Kathy Walrath, Alison Huml. The Java Tutorial. Sun Microsystems, Terceira Edio, 2003. Dispon ca vel para download e online em http://java.sun.com/docs/books/tutorial/ [3] Sun Microsystems Java 2 Platform, Standard Edition, v 1.4.1 API Specication. Sun Microsystems, 2003. Dispon online e para download em vel http://java.sun.com/docs/ [4] Fbio Mengue Curso de Java - Mdulo II - Swing. Cena o tro de Computao da Unicamp, 2002. Dispon ca vel online em http://ftp.unicamp.br/pub/apoio/treinamentos/linguagens /curso_java_II.pdf [5] Prof. Marcelo Cohen Interface Grca. Dispon a vel online em http://www.inf.pucrs.br/~flash/lapro2/lapro2_gui_old.pdf [6] Lucas Wanner Introduo ` Linguagem Java. Verso 1.1, 2002. Dispon ca a a vel online em http://monica.inf.ufsc.br

84

Você também pode gostar