Java SE Banco de Dados e Swing

Embed Size (px)

Citation preview

Java Avanado com acesso JDBC a Banco de Dados, Arquivos, Swing e Eventos

Java Avanado

Sumrio1. Frameworks para interfaces grficas...........................1 Objetivos.....................................................................................2 Abstract Window Toolkit (AWT) ..................................................3 Swing..........................................................................................4 Exerccios....................................................................................7 Gerenciadores de Layout............................................1 Objetivos.....................................................................................2 Introduo...................................................................................3 FlowLayout..................................................................................4 BorderLayout..............................................................................6 GridLayout..................................................................................9 Exerccios..................................................................................11 Tratamento de Eventos....................... ......................13 Objetivos...................................................................................14 Listeners...................................................................................15 Formas de Tratamento de Eventos...........................................16 Eventos de Mouse.....................................................................23 Exerccios..................................................................................36 Componentes para Interface Grfica...........................1 Objetivos.....................................................................................2 JFrame.........................................................................................3 JLabel..........................................................................................6 JButton........................................................................................9 JTextField e JPasswordField........................................................12 JTextArea...................................................................................16 JPanel........................................................................................19 JComboBox................................................................................21 Construindo Menus...................................................................24 Entendendo as Caixas de Dilogo.............................................36 JOptionPane..............................................................................37 JTable........................................................................................41 JScrollPane................................................................................44 JFileChooser..............................................................................46 Exerccios..................................................................................48 Look And Feel...................... ......................................1 Objetivos....................................................................................2 Aparncia e Comportamento......................................................3 Exerccios....................................................................................6 Arquivos................................................. ...................1 I

2.

3.

4.

5.

6.

Frameworks para interfaces grficas Objetivos.....................................................................................2 Introduo...................................................................................3 Hierarquia de Dados...................................................................4 Arquivos e Fluxos........................................................................7 Testando Arquivos.....................................................................13 Criando um Arquivo..................................................................16 Lendo Dados de um Arquivo.....................................................25 Gerenciamento de memria: Garbage Collector ......................34 Exerccios..................................................................................35 7. Acesso a Banco de Dados....................................... .....1 Objetivos.....................................................................................1 Introduo...................................................................................2 JDBC Drivers................................................................................3 Aplicao vs JDBC Driver............................................................7 JDBC URLs...................................................................................8 Server Side Driver.....................................................................11 Acessando Bases de Dados por JDBC.......................................12 Etapa 1: Connect......................................................................13 Etapa 2: Query..........................................................................16 Etapa 3: Process results............................................................20 Etapa 4: Close...........................................................................23 MetaData..................................................................................26 Tipo de Dados...........................................................................27 Resumo Tecnologia JDBC ..........................................................28 Acessando Bases de Dados com JDBC......................................29 Registrando Fonte de Dados de ODBC......................................35 Manipulando Banco de Dados com ODBC.................................37 Processamento de Transaes..................................................48 Exerccios..................................................................................49

II

1.Frameworks para interfaces grficas

1

Frameworks para interfaces grficas

Objetivos Conhecer os diferentes frameworks existentes para construo de interfaces grficas Enteder as relaes e a evoluo destes frameworks Conhecer as diferenas entre estes frameworks

2

Frameworks para interfaces grficas

Abstract Window Toolkit (AWT)

O framework AWT (Abstract Window Toolkit pacote java.awt) foi a primeira interface grfica moderna e difundida para a linguagem Java. Tendo como caractersticas possuir componentes de peso pesado, ou seja, componente que esto associados diretamente a capacidade da plataforma local apresenta como problema principal as diferenas de interao com o usurio sensitivas a plataforma. Este framework serviu de base para a construo do Swing que utiliza alguns de seus recursos. Atualmente este pacote utilizado para completar partes que no foram re-escritas em Swing. Em todo programa Swing sempre haver alguma classe AWT sendo utilizada pois existem eventos e componentes que no foram reimplementados no Swing pelo AWT j atender as necessidades.

3

Frameworks para interfaces grficas

SwingAs classes que so utilizadas para criar os componentes so parte dos componentes GUI do Swing do pacote javax.swing. Esses so os mais novos componentes GUI da plataforma do Java 2. DICA: Uma forma fcil de diferenciar classes Swing de classes AWT pelo seu prefixo, todas classes Swing inicial com a letra J. Os componentes Swing (como so comumente denominados) so escritos, manipulados e exibidos completamente em Java (chamados componentes Java puros). Os componentes GUI originais do pacote java.awt (Abstract Windowing Toolkit - tambm chamado de AWT) esto diretamente associados com as capacidades de GUI da plataforma local. Ento, um programa Java executando em diferentes plataformas Java tem uma aparncia diferente e, s vezes, at diferentes interaes de usurio em cada plataforma. Juntos, o aspecto e a maneira como o usurio interage com o programa so conhecidos como aparncia e comportamento ("look and feel") desse programa. Os componentes do Swing permitem ao programador especificar uma aparncia e um comportamento diferente para cada plataforma, ou uma aparncia e um comportamento uniforme entre todas as plataformas, ou at mesmo alterar a aparncia e comportamento enquanto o programa est executando. Os componentes Swing so freqentemente referidos como componentes de peso leve - so completamente escritos em Java de modo a no "serem pesados" pelas complexas capacidades GUI da plataforma em que so utilizados. Os componentes AWT (muitos dos quais so equivalentes dos componentes Swing) que so vinculados plataforma local so correspondentemente chamados de componentes de peso pesado - contam com o sistema de janela da plataforma local para determinar sua funcionalidade e sua aparncia e comportamento. Cada componente de peso pesado tem um "peer" (um equivalente do pacote java.awt.peer) que responsvel pelas interaes entre o componente e a plataforma local para exibir e manipular o componente. Vrios componentes Swing ainda so componentes de peso pesado. Em particular, as subclasses de java.awt.Window que exibem janelas na tela ainda requer em interao direta com o sistema local de janelas. A hierarquia de herana das classes que define atributos comportamentos que so comuns para a maioria dos componentes Swing. e

4

Frameworks para interfaces grficas

java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent

Cada classe exibida com o nome de seu pacote e nome de classe completamente qualificado. Grande parte da funcionalidade de cada componente GUI derivada dessas classes. Uma classe que herda da classe Component um componente. Por exemplo, a classe Container herda da classe Component e a classe Component herda de Object. Portanto, um Container um Component e um Object, e um Component um Object. Uma classe que herda da classe Container um Container. Portanto, um JComponent um Container. A classe Component define os mtodos que podem ser aplicados a um objeto de qualquer subclasse de Component. Dois dos mtodos que se originam na classe Component so paint e repaint. importante entender os mtodos de classe Component, porque grande parte da funcionalidade herdada por cada subclasse de Component definida originalmente pela classe Component. As operaes comuns para a maioria dos componentes GUI (tanto Swing como AWT) esto localizadas na classe Component. Um Container uma coleo de componentes relacionados. Em aplicativos com JFrames e em Applets, anexamos os componentes ao painel de contedo - um Container. A classe Container define o conjunto de mtodos que podem ser aplicados a um objeto de qualquer subclasse de Container. Um mtodo que se origina na classe Container add. Outro mtodo que origina na classe Container setLayout, que utilizado para especificar o gerenciador de layout que ajudam um Container a posicionar e dimensionar seus componentes. A classe JComponent a superclasse para a maioria dos componentes Swing. Essa classe define o conjunto de mtodos que pode ser aplicado a um objeto de qualquer subclasse de JComponent. Os componentes Swing que derivam da subclasse JComponent tm muitos recursos, incluindo:

5

Frameworks para interfaces grficas

Uma aparncia e um comportamento plugvel, que podem ser utilizados para personalizar a aparncia e o comportamento quando o programa executa em plataformas diferentes. Teclas de atalho (chamadas de mnemnicas) para acesso direto a componentes GUI pelo teclado. Capacidades comuns de tratamento de eventos para casos onde vrios componentes GUI iniciam as mesmas aes em um programa. Breves descries do propsito de um componente GUI (chamadas de dicas de ferramenta). Elas so exibidas quando o cursor de mouse posicionado sobre o componente por um breve instante. Suporte a tecnologias de auxilio ao deficiente fsico como leitores de tela de braile para pessoas cegas. Suporte para localizao de interface com o usurio - personalizando a interface com o usurio para exibir em diferentes idiomas e convenes culturais.

6

Frameworks para interfaces grficas

Exerccios1. Explique a relao existente entre Swing e AWT. 2. Qual a diferena entre componentes de peso pesado e componentes de peso leve? 3. Como identificar facilmente pelo nome de uma classe de interface grfica se esta faz parte do Swing ou AWT?

7

Frameworks para interfaces grficas

Espao para anotaes

8

2.Gerenciadores de Layout

1

Tratamento de Eventos

Objetivos Apresentar os principais gerenciadores de layout de interface grfica BorderLayout FlowLayout GridLayout

Discutir as principais implementaes de layout Identifir a melhor implementao de acordo com o foco de utilizao

2

Tratamento de Eventos

IntroduoOs gerenciadores de layout so fornecidos para organizar componentes GUI em um conteiner para propsitos de apresentao. Eles fornecem capacidades bsicas de layout que so mais fceis de utilizar do que determinar a posio e o tamanho exatos de cada componente GUI. Isso permite ao programador concentrar-se na aparncia e comportamento bsicos e deixar os gerenciadores de layout processar a maioria dos detalhes de layout. Alguns designers de GUI tambm permitem ao programador utilizar os gerenciadores de layout descritos abaixo:Gerenciador de Layout

Descrio

FlowLayout

Padro para java.awt.Applet, java.awt.Panel e javax.swing.JPanel. Coloca os componentes seqencialmente (da esquerda para a direita) na ordem que foram adicionados. Tambm possvel especificar a ordem dos componentes utilizando o mtodo add de Container que aceita um Component e uma posio de ndice inteiro como argumentos. Padro para os painis de contedo de JFrames (e outras janelas) e JApplets. Organiza os componentes em cinco reas: Norte, Sul, Leste, Oeste e Centro. Organiza os componentes nas linhas e colunas.

BorderLayout

GridLayout

Tabela 2-1: Descrio dos gerenciadores de layout

A maioria dos exemplos anteriores de applet e de aplicativos em que criamos nossa prpria GUI utilizou o gerenciador de layout FlowLayout. A classe FlowLayout herda da classe Object e implementa a interface Layout.Manager, que define os mtodos que um gerenciador de layout utiliza para organizar e dimensionar componentes GUI em um conteiner.

3

Tratamento de Eventos

FlowLayout

FlowLayout o gerenciador de layout mais bsico. Os componentes GUI so colocados em um conteiner da esquerda para a direita na ordem em que so adicionados ao mesmo. Quando a borda do conteiner alcanada, os componentes continuam na prxima linha. A classe FlowLayout permite aos componentes GUI ser alinhados esquerda, centralizados (o padro) e alinhados direita.package com.targettrust.java.capitulo02; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FlowLayoutDemo extends JFrame { private JButton left, center, right; private Container c; private FlowLayout layout; public FlowLayoutDemo() { super( "FlowLayout Demo" ); layout = new FlowLayout(); c = getContentPane(); c.setLayout( layout ); left = new JButton( "Left" ); left.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { layout.setAlignment( FlowLayout.LEFT ); layout.layoutContainer( c ); } }); c.add( left ); center = new JButton( "Center" ); center.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { layout.setAlignment( FlowLayout.CENTER ); layout.layoutContainer( c ); } }); c.add( center ); right = new JButton( "Right" ); right.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { layout.setAlignment( FlowLayout.RIGHT ); 4

Tratamento de Eventos layout.layoutContainer( c ); }); c.add( right ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 300, 75 ); setVisible(true); }

}

public static void main( String args[] ) { FlowLayoutDemo app = new FlowLayoutDemo(); } } Cdigo 2-1: Exemplo de utilizao de FlowLayout.

O aplicativo de exemplo cria trs objetos JButton e os adiciona ao aplicativo que utiliza um gerenciador de layout FlowLayout. Os componentes so automaticamente alinhados no centro. Quando o usurio clica em Left, o alinhamento para o gerenciador de layout alterado para um FlowLayout alinhado esquerda. Quando o usurio clica em Right, o alinhamento para o gerenciador de layout alterado para um FlowLayout alinhado direita. Quando o usurio clica em Center, o alinhamento para o gerenciador de layout alterado para um como visto anteriormente, um layout do container estabelecido com o mtodo setLayout de classe Container. Configuramos o gerenciador de layout do painel de contedo como o FlowLayout. Normalmente, o layout configurado antes de quaisquer componentes GUI serem adicionados a um conteiner.

Figura 2-1:Exemplo de interface construda com FlowLayout

Cada tratador de evento actionPerformed do boto executa duas instrues. Por exemplo, o mtodo actionPerformed para o boto left utiliza o mtodo FlowLayout setAlignment para alterar o alinhamento para o FlowLayout para um FlowLayout alinhado esquerda (FlowLayout .LEFT). O mtodo de interface LayoutManager layoutContainer para especificar que o painel de contedo deve ser reorganizado com base no layout ajustado. De acordo com qual boto foi clicado, o mtodo actionPerformed para cada boto configura o alinhamento do FlowLayout como FlowLayout.LEFT, FlowLayout.CENTER ou FlowLayout.RIGHT.5

Tratamento de Eventos

BorderLayout

O gerenciador de layout BorderLayout (o gerenciador de layout-padro para o painel de contedo) organiza componentes em cinco regies: Norte, Sul, Leste, Oeste e Centro (Norte corresponde parte superior do container). A classe BorderLayout herda de Object e implementa a interface LayoutManager2 (uma subinterface de LayoutManager que adiciona vrios mtodos para um processamento de layout aprimorado). At cinco componentes podem ser adicionados diretamente a um BorderLayout um para cada regio. Os componentes colocados nas regies Norte e Sul estendem-se horizontalmente para os lados do conteiner e tem a mesma altura que o componente mais alto colocado nessas regies. As regies Leste e Oeste expandem-se verticalmente entre as regies Norte e Sul e tem a mesma largura que o componente mais largo colocado nessas regies. O componente colocado na regio Centro expande-se para tomar todo o espao restante no layout. Se todas as cinco regies so ocupadas, o espao do container inteiro coberto por componentes GUI. Se a regio Norte ou a regio Sul no for ocupada, os componentes GUI nas regies Leste, Centro e Oeste expandem-se verticalmente para preencher o espao restante. Se a regio Leste ou Oeste no for ocupada, o componente GUI na regio Centro expande-se horizontalmente para preencher o espao restante. Se a regio Centro no for ocupada, a rea deixada vazia os outros componentes GUI no se expandem para preencher o espao restante. O aplicativo BorderLayoutDemo demonstra o gerenciador de layout BorderLayout utilizando cinco JButtons.package com.targettrust.java.capitulo02; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BorderLayoutDemo extends JFrame implements ActionListener { private JButton b[]; private String names[] = {"Hide North", "Hide South", "Hide East", "Hide West", "Hide Center"}; private BorderLayout layout; public BorderLayoutDemo() { super( "BorderLayout Demo" ); layout = new BorderLayout( 5, 5 ); 6

Tratamento de Eventos

Container c = getContentPane(); c.setLayout( layout ); b = new JButton[ names.length ]; for ( int i = 0; i < names.length; i++ ) { b[ i ] = new JButton( names[ i ] ); b[ i ].addActionListener( this ); } c.add( c.add( c.add( c.add( c.add( b[ b[ b[ b[ b[ 0 1 2 3 4 ], ], ], ], ], BorderLayout.NORTH ); BorderLayout.SOUTH ); BorderLayout.EAST ); BorderLayout.WEST ); BorderLayout.CENTER );

setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 300, 200 ); setVisible(true);

}

public void actionPerformed( ActionEvent e ) { for ( int i = 0; i < b.length; i++ ) { if ( e.getSource() == b[ i ] ) { b[ i ].setVisible( false ); } else { b[ i ].setVisible( true ); } } layout.layoutContainer( getContentPane() ); } public static void main( String args[] ) { BorderLayoutDemo app = new BorderLayoutDemo(); } } Cdigo 2-2: Exemplo de utilizao de BorderLayout.

No construtor de BorderLayout os argumentos especificam o nmero de pixels entre componentes que so organizados horizontalmente (espaamento horizontal) e o nmero de pixels entre componentes que so organizados verticalmente (espaamento vertical), respectivamente. O construtor-padro BorderLayout fornece 0 pixel de espaamento horizontal e verticalmente. Utilizamos o mtodo setLayout para configurar o layout do painel de contedo como layout. Adicionar componentes a um BorderLayout requer um mtodo add diferente da classe Container, que aceita dois argumentos o Component para adicionar e a regio em que o Component ser colocado. Por exemplo, especificamos que o b[0] deve ser colocado na posio NORTE.

7

Tratamento de Eventos

Figura 2-2: Exemplo de interface com BorderLayout

Os componentes podem ser adicionados em qualquer ordem, mas apenas um componente pode ser adicionado a cada regio. Quando o usurio clica em um JButton particular no layout, o mtodo actionPerformed chamado. O comando for utiliza a seguinte estrutura condicional: Para ocultar o JButton particular que gerou o evento. O mtodo setVisible (herdado em JButton da classe Component) chamado com um argumento false. Se o JButton atual no array no o que gerou o evento, o mtodo setVisible chamado com um argumento true para assegurar que o JButton exibido na tela. Utilizamos o mtodo LayoutManager layoutContainer para recalcular o layout do painel de contedo. Tente redimensionar a janela de aplicativo para ver como as vrias regies redimensionam-se baseadas na largura e altura da janela.

8

Tratamento de Eventos

GridLayoutO gerenciador de layout GridLayout divide o container em uma grade de modo que os componentes podem ser colocados nas linhas e colunas. A classe GridLayout herda diretamente da classe Object e implementa a interface LayoutManager. Cada Component em um GridLayout tem a mesma largura e altura. Os componentes so adicionados a um GridLayout iniciando a clula na parte superior esquerda da grade e prosseguindo da esquerda para a direita at a linha estar cheia. Ento o processo continua da esquerda para a direita na prxima linha da grade, e assim por diante. Este exemplo demonstra o gerenciador de layout GridLayout utilizando seis JButtons.

package com.targettrust.java.capitulo02; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GridLayoutDemo extends JFrame implements ActionListener { private private private private private JButton b[]; String names[] = { "one", "two", "three", "four", "five", "six" }; boolean toggle = true; Container c; GridLayout grid1, grid2;

public GridLayoutDemo() { super( "GridLayout Demo" ); grid1 = new GridLayout( 2, 3, 5, 5 ); grid2 = new GridLayout( 3, 2 ); c = getContentPane(); c.setLayout( grid1 ); b = new JButton[ names.length ]; for (int i = 0; i < names.length; i++ ) { b[ i ] = new JButton( names[ i ] ); b[ i ].addActionListener( this ); c.add( b[ i ] ); } setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 300, 150 ); setVisible(true); } public void actionPerformed( ActionEvent e ) { if ( toggle ) { c.setLayout( grid2 ); } else { c.setLayout( grid1 ); } 9

Tratamento de Eventos toggle = !toggle; c.validate();

}

public static void main( String args[] ) { GridLayoutDemo app = new GridLayoutDemo(); } } Cdigo 2-3: Exemplo de utilizao de GridLayout.

Defininos dois objetos GridLayout. O construtor GridLayout utilizado especifica um GridLayout com 2 linhas, 3 colunas, 5 pixels de espaamento horizontal entre os Components na grade e 5 pixels de espaamento vertical entre Components na grade. O prximo construtor GridLayout especifica um GridLayout com 3 linhas, 2 colunas e nenhum espaamento.

Figura 2-3: Exemplo de interface GridLayout

Os objetos JButton nesse exemplo so inicialmente organizados utilizando grid1 (associado ao painel de contedo com o mtodo setLayout). O primeiro componente adicionado primeira coluna da primeira linha. O prximo componente adicionado segunda coluna da primeira linha etc. Quando um JButton pressionado, o mtodo actionPerformed chamado. Cada chamada para actionPerformed alterna o layout entre grid2 e grid1. Redesenhos um container cujo layout foi alterado onde o mtodo Container validate recalcula o layout do container com base no gerenciador de layout atual para o Container e o conjunto atual de componentes GUI exibidos.

10

Tratamento de Eventos

Exerccios1. Quais as diferenas entre FlowLayout, BorderLayout e GridLayout? 2. Crie um tabuleiro de Xadrez utilizando os gerenciadores de Layout que voc estudou neste captulo. Para isto veja a imagem abaixo:

11

Tratamento de Eventos

Espao para anotaes

12

Tratamento de Eventos

3.Tratamento de Eventos

13

Tratamento de Eventos

Objetivos Entender como podem ser tratados os eventos na linguagem java Conhecer as principais interfaces para tratar eventos Criar uma aplicao e utilizar o mecanismo de tratamento de eventos

14

Tratamento de Eventos

ListenersQuando ocorre uma interao com o usurio, um evento automaticamente enviado para o programa. Informaes de eventos GUI so armazenadas em um objeto de uma classe que estende AWTEvent. Os tipos de evento de pacote java.awt.Event so ainda utilizados com os componentes Swing. Tambm foram adicionados outros tipos de evento que so especficos para vrios tipos de componentes Swing. Novos tipos de evento de componente do Swing so definidos no pacote javax.swing.Event. Para processar um evento de interface grfica com o usurio, o programador deve realizar duas tarefas principais - registrar um ouvinte de eventos (Listener) e implementar um tratador (handler) de eventos. Um ouvinte de eventos para um evento GUI um objeto de uma classe que implementa uma ou mais das interfaces ouvintes de eventos dos pacotes java.awt.Event e javax.swing.Event. Muitos dos tipos de ouvinte de eventos so comuns aos componentes Swing e AWT. Esses tipos so definidos no pacote java.awt.Event. Tipos adicionais de ouvinte de eventos que so especficos de componentes Swing so definidos no pacote javax.swing.Event. Um objeto ouvinte de eventos "ouve" tipos especficos de eventos gerados no mesmo objeto ou por outros objetos (normalmente componentes GUI) em um programa. Um tratador de eventos um mtodo que automaticamente chamado em resposta a um tipo de evento em particular. Cada interface ouvinte de eventos especifica um ou mais mtodos de tratamento de evento que devem ser definidos na classe que implementa a interface ouvinte de eventos. Lembre-se de que as interfaces definem mtodos abstract. Qualquer classe que implementa uma interface deve definir todos os mtodos dessa interface; caso contrrio, a classe uma classe abstract e no pode ser utilizada para criar objetos. O uso de ouvintes de eventos em tratamento de eventos conhecido como modelo de delegao de evento - o processamento de um evento delegado a um objeto particular no programa. Quando um evento ocorre, o componente GUI com o qual o usurio interagiu notifica seus ouvintes registrados chamando o mtodo de tratamento de evento apropriado de cada ouvinte. Por exemplo, quando o usurio pressiona a tecla Enter em um JTextField, o mtodo actionPerformed do ouvinte registrado chamado.

15

Tratamento de Eventos

Formas de Tratamento de Eventos

J conhecendo o funcionamento dos Listeners (conforme item anterior) deve-se compreender de que forma capturar estes eventos atravs dos ouvintes (Listeners). Existem vrias interfaces de tratamento de eventos, o objetivo deste captulo explicar as formas de como trabalhar com estas interfaces e no as interfaces propriamente ditas. Desta forma, este captulo baseado em uma nica interface a ActionListener, a fim de facilitar o estudo. Todas interfaces (ActionListener, MouseListener, WindowListener, KeyListener, MouseMotionListener) sero detalhadas no prximo captulo O tratamento de eventos pode ser feito atravs de trs formas, conforme seguem as subsees deste captulo.

16

Tratamento de Eventos

Implementando uma interface

Esta forma de realizar o tratamento de eventos consiste em uma classe implementar uma interface para que a mesma possa ter comportamentos que a habilitem tratar determinados tipos de eventos. Isto pode ser feito pela prpria classe onde os ventos so originados ou por outra classe. Os objetos criados a partir desta classe tero a capacidade de responder a eventos. Existem vrias interfaces que descrevem tipos de comportamentos, tais como: ActionListener, MouseListener, WindowListener, KeyListener, MouseMotionListener. Estas interfaces possuem mtodos abstratos que obrigatoriamente devem ser implementados quando utilizadas, estes mtodos so os responsveis pelo tratamento dos eventos. Veja abaixo um exemplo de implementao de interface pela prpria classe onde os eventos so originados:package com.targettrust.java.capitulo03; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExemploEventos extends JFrame implements ActionListener { public ExemploEventos() { super( "Exemplo de tratamento de eventos" ); JButton botao = new JButton("Teste"); botao.setSize(80, 20); getContentPane().setLayout(new FlowLayout()); getContentPane().add(botao); botao.addActionListener(this); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize( 350, 200 ); setVisible( true ); } public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(getContentPane(), e.getActionCommand()); } public static void main(String[] args) { ExemploEventos app = new ExemploEventos(); }

} Cdigo 3-1: Cdigo fonte de exemplo de tratamento de eventos. 17

Tratamento de Eventos

O programa acima exemplifica o tratamento de eventos atravs da utilizao de uma interface AcionListener. Ao implementer a interface action listener necessrio utilizar o mtodo actionPerformed() o qual recebe como parmetro o evento. Alm de implementer a interface ActionListener e programas o mtodo actionPerformed o programa realize uma achamada ao mtodo addActionListener do objeto botao (JButton), este feito para registrar ao ouvinte quais objetos devem ser tratados. Resumindo, implementer interfaces para tartar eventos se divide em 3 passos bsicos: 1. Implementar a interface 2. Implementar seus mtodos abstratos 3. Definir quais objetos sero escutados, adicionando-os ao listener.

18

Tratamento de Eventos

Delegando o tratamento a outro objeto

A segunda forma de realizar o tratamento de eventos delegando a um outro objeto o tratamento dos eventos, ou seja, o programa possui uma classe com a GUI e uma outra classe apenas para tartar os eventos desta.package com.targettrust.java.capitulo03; import java.awt.*; import javax.swing.*; public class DelegandoEventos extends JFrame { public DelegandoEventos() { setTitle("Exemplo de Tratamento de Eventos"); setSize(400, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); JButton botao = new JButton("Sair"); botao.setSize(80, 20); getContentPane().setLayout(new FlowLayout()); getContentPane().add(botao); botao.addActionListener(new TratandoEventos()); setVisible(true); } public static void main(String[] args) { DelegandoEventos app = new DelegandoEventos(); } Cdigo 3-2: Delegando a outro objeto o tratamento de eventos, contruo da GUI.

}

O programa acima cria a GUI com uma janela e um boto sair. Observando o cdigo nota-se a chamada ao mtodo botao.addActionListener(new TratandoEventos()). Este mtodo esta delegando a outra classe (TratandoEventos) o tratamento dos eventos sobre o boto sair.

Abaixo segue o cdigo da classe TratandoEventos:19

Tratamento de Eventos

package com.targettrust.java.capitulo03; import java.awt.event.*; import javax.swing.*; public class TratandoEventos implements ActionListener { public void actionPerformed(ActionEvent e) { System.exit(0); } } Cdigo 3-3: Tratando evento do boto sair.

Neste programa foi implementada a interface ActionListener e implementado o mtodo actionPerformed que esta recebendo como parmetro os eventos do boto sair do primeiro programa pois foi adicionado ao ouvinte. Ao receber qualquer aa sobre este boto o programa realize um System.exit(0);

20

Tratamento de Eventos

Utilizando Classes Annimas InternasA terceira e ltima forma de realizar tratamento de eventos atravs de classes annimas internas (Anonymys Inner Class). Este modo de tratamento semelhante a delegar a outro objeto (veja o tpico anterior) com a diferena de no possuir uma classe nomeada para tratar o evento, ou seja, o objeto criado com uma instruo new no proprio mtodo addActionListener. Resumindo, esta uma forma mais prtica de implementer o tratamento de eventos, pois no existe a necessidade de duas classes nomeadas e possivelmente em arquivos separados.package com.targettrust.java.capitulo03; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ClassesAnonimas extends JFrame { public ClassesAnonimas() { super("Exemplo de Tratamento de Eventos"); JButton botao = new JButton("Sair"); botao.setSize(80, 20); getContentPane().setLayout(new FlowLayout()); getContentPane().add(botao); botao.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { System.exit(0); } } ); setSize(400, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); {

}

public static void main(String[] args) new ClassesAnonimas(); }

} Cdigo 3-4: Tratando eventos com classes annimas internas.

Prestando ateno no mtodo addActionListener() do objeto boto (JButton) verifica-se que no existe a chamada a uma classe criada anteriormente e sim a um objeto criadao dentro do mtodo atravs da instruo new. O trecho de cdigo new ActionListener() { }, possui a mesma funcionalidade que foi detalhada na subseo anterior deste mesmo captulo com a diferena de no nomear uma nova classe e sim fazer a declarao desta no prprio mtodo de ligao com o ouvinte.21

Tratamento de Eventos

Interfaces para Tratamento de EventosO objetivo desta subseo explicar o funcionamento de cada uma das interfaces existentes para tratamento de eventos.CategoriaAco Item Movimento do mouse Boto do mouse

Nome da interfaceActionListener ItemListener

Adaptador-

Mtodospublic void actionPerformed(ActionEvent e) public void itemStateChanged(ItemEvent e) public void mouseDragged(MouseEvent e) public void mouseMoved(MouseEvent e) public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) public void keyPressed(KeyEvent e) public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e) public void focusGained(FocusEvent e) public void focusLost(FocusEvent e) public void adjustmentValueChanged(AdjustmentEvent e) public void componentMoved(ComponentEvent e) public void componentHidden(ComponentEvent e) public void componentResized(ComponentEvent e) public void componentShown(ComponentEvent e)

MouseMotionListener MouseMoutionAdapter MouseListener MouseAdapter

Tecla Foco Ajuste Componente

KeyListener FocusListener AjustmentListener ComponentListener

KeyAdapter FocusAdapter

ComponentAdapter

Janela

WindowListener

WindowAdapter

public void windowClosing(WindowEvent e) public void windowOpened(WindowEvent e) public void windowIconified(WindowEvent e) public void windowDeiconified(WindowEvent e) public void windowClosed(WindowEvent e) public void windowActivated(WindowEvent e) public void windowDeactivated(WindowEvent e)

Recipiente

ContainerListener

ContainerAdapter

public void componentRemoved(ContainerEvent e) public void componentAdded(ContainerEvent e) public void textValueChanged(TextEvent e) public void mouseWheelMoved(MouseWheelEvent e) public void windowStateChanged(WindowEvent e)

Texto Mouse Wheel Estado da Janela

TextListener MouseWheelListener WindowStateListener

-

22

Tratamento de Eventos

Eventos de MouseEsta seo apresenta as interfaces ouvintes de eventos MouseListener e MouseMotionListener para tratar eventos de mouse. Os eventos de mouse podem ser capturados por qualquer componente GUI que deriva de java.awt.Component. Os mtodos de interfaces MouseListener e MouseMotionListener so resumidos em:

public void mousePressed( MouseEvent e ) { }

Chamado quando um boto do mouse pressionado com o cursor de mouse em um componente.

public void mouseClicked( MouseEvent e ) { }

Chamado quando um boto do mouse pressionado e liberado em um componente sem mover o cursor do mouse.

public void mouseReleased( MouseEvent e ) { }

Chamado quando um boto do mouse liberado depois de ser pressionado. Esse evento sempre precedido por uni evento mousePressed.

public void mouseEntered( MouseEvent e ) { }

Chamado quando o cursor do mouse entra nos limite de um componente.

public void mouseExited( MouseEvent e ) { }

Chamado quando o cursor do mouse deixa os limite de um componente.

public void mouseDragged( MouseEvent e ) { }

Chamado quando o boto do mouse pressionado e o mouse movido. Esse evento sempre precedido por uma chamada para mousePressed.

public void mouseMoved( MouseEvent e )

{}

Chamado quando o mouse movido com o cursor do mouse em um componente.

Cada um dos mtodos de tratamento de eventos do mouse aceita um objeto MouseEvent como seus argumentos. Um objeto MouseEvent contm as informaes sobre o evento de mouse que ocorreu, incluindo as coordenadas x e y da localizao onde o evento ocorreu.23

Tratamento de Eventos

Os mtodos MouseListener e MouseMotionListener so chamados automaticamente quando o mouse interage com um Component se os objetos ouvintes esto registrados em um Component particular. O mtodo mousePressed chamado quando um boto do mouse pressionado com o cursor do mouse sobre um componente. Utilizando mtodos e constantes da classe InputEvent (a superclasse de MouseEvent), um programa pode determinar em que boto do mouse o usurio clicou. O mtodo mouseClicked chamado sempre que um boto do mouse liberado sem mover o mouse depois de uma operao mousePressed. O mtodo mouseReleased chamado sempre que um boto do mouse liberado. O mtodo mouseEntered chamado quando o cursor do mouse entra nos limites fisicos de um Component. O mtodo mouseExited chamado quando o cursor de mouse deixa os limites fisicos de um Component. O mtodo mouseDragged chamado quando o boto do mouse pressionado e mantido pressionado e o mouse movido (um processo conhecido como arrastar). O evento mouseDragged precedido por um evento mousePressed e seguido por um evento mouseReleased. O mtodo mouseMoved chamado quando o mouse movido com o cursor de mouse sobre um componente (e nenhum boto do mouse pressionado). O aplicativo MouseTracker demonstra os mtodos MouseListener e MouseMotionListener. A classe do aplicativo implementa as duas interfaces de modo a poder ouvir seus prprios eventos de mouse. Observe que todos os sete mtodos dessas duas interfaces devem ser definidos pelo programador quando uma classe implementa as duas interfaces.package com.targettrust.java.capitulo03; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MouseTracker extends JFrame implements MouseListener, MouseMotionListener { private JLabel statusBar; public MouseTracker() { super( "Demonstrando Evento do mouse" ); statusBar = new JLabel(); 24

Tratamento de Eventos getContentPane().add( statusBar, BorderLayout.SOUTH ); addMouseListener( this ); addMouseMotionListener( this ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); setSize( 275, 100 ); show();

}

public void mouseClicked( MouseEvent e ) { statusBar.setText( "Clicked em [" + e.getX() + ", " + e.getY() + "]" ); } public void mousePressed( MouseEvent e ) { statusBar.setText( "Pressed em [" + e.getX() + ", " + e.getY() + "]" ); } public void mouseReleased( MouseEvent e ) { statusBar.setText( "Released em [" + e.getX() + ", " + e.getY() + "]" ); } public void mouseEntered( MouseEvent e ) { statusBar.setText( "Mouse na janela" ); } public void mouseExited( MouseEvent e ) { statusBar.setText( "Mouse fora da janela " ); } public void mouseDragged( MouseEvent e ) { statusBar.setText( "Dragged em [" + e.getX() + ", " + e.getY() + "]" ); } public void mouseMoved( MouseEvent e ) { statusBar.setText( "Moved em [" + e.getX() + ", " + e.getY() + "]" ); } public static void main( String args[] ) { MouseTracker app = new MouseTracker(); } } Cdigo 3-5: Tratando eventos do mouse

Cada evento de mouse resulta na exibio de um String em JLabel statusBar na parte inferior da janela. Definimos JLabel statusBar e o anexamos ao painel de contedo. At agora, toda as vezes que utilizamos o painel de contedo, o mtodo setLayout foi chamado para configurar o gerenciador de layout do painel de contedo como um FlowLayout. Isso permitiu ao painel de contedo exibir os componentes GUI que anexamos a ele da esquerda para a direta. Se os componentes GUI no se ajustarem em uma linha, o FlowLayout cria linhas adicionais para continuar exibindo os componentes GUI.25

Tratamento de Eventos

Realmente, o gerenciador padro de layout um BorderLayout que divide a rea do painel de contedo em cinco regies - norte, sul, leste, oeste e centro.

Figura 3-1: Exemplo de tratamento de eventos do mouse

Utilizamos uma nova verso do mtodo Container add para anexar statusBar regio BorderLayout.SOUTH, que se estende ao longo de toda a parte inferior do painel de contedo. Registramos o objeto de janela MouseTracker como o ouvinte para seus prprios eventos de mouse. Os mtodos add.MouseListener e addMouseMotionListener so os mtodos Component que podem ser utilizados para registrar ouvintes de eventos de mouse para um objeto de qualquer classe que estenda Component. Quando o mouse entra ou sai da rea do aplicativo, o mtodo mouseEntered e o mtodo mouseExited so chamados, respectivamente. Ambos os mtodos exibem uma mensagem na statusBar indicando que o mouse est dentro do aplicativo ou que o mouse est fora do aplicativo. Quando quaisquer dos outros cinco eventos ocorrem, eles exibem uma mensagem na statusBar que inclui um String representando o evento que ocorreu e as coordenadas onde o evento de mouse ocorreu. As coordenadas x e y do mouse em que o evento ocorreu so obtidas com os mtodos MouseEvent getX e getY, respectivamente.

26

Tratamento de Eventos

Classes Adaptadoras

Muitas das interfaces ouvintes de eventos fornecem mltiplos mtodos: MouseListener e MouseMotionListener so exemplos. No sempre desejvel definir cada mtodo em uma interface ouvinte de evento. Por exemplo, um programa pode precisar apenas do tratador de interface MouseListener mouseClicked ou do tratador MouseMotionListener mouseDragged. Em nossos aplicativos de janela (subclasses de JFrame), o trmino do aplicativo foi tratado com o windowClosing da interface WindowListener, que na realidade especifica sete mtodos de tratamento de eventos de janela. Para muitas das interfaces ouvintes que contm mltiplos mtodos, os pacotes java.awt.Event e javax.swing.Event fornecem classes adaptadoras de ouvinte de eventos. Uma classe adaptadora implementa uma interface e fornece uma implementao padro (com o corpo de um mtodo vazio) de cada mtodo na interface. As classes adaptadoras java.awt.Event so mostradas abaixo junto com as interfaces que elas implementam.Implementa a Interface ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener Classe Adaptadora de Eventos ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter

Tabela 3-1: Interfaces implementadas por classes adaptadoras.

O programador pode estender a classe adaptadora para herdar a implementao padro de cada mtodo e ento anular o(s) mtodo(s) necessrio(s) para tratamento de eventos.27

Tratamento de Eventos

A implementao padro de cada mtodo na classe adaptadora tem um corpo vazio. Isso exatamente o que temos feito em cada exemplo de aplicativo que estende JFrame e define o mtodo windowClosing para tratar o fechamento da janela e o encerramento do aplicativo. O aplicativo Painter utiliza o tratador de evento mouseDragged para criar um programa simples de desenho. O usurio pode desenhar figuras com o mouse arrastando o mouse no fundo da janela. Como no pretendemos utilizar o mtodo mouseMoved, nosso MouseMotionListener definido como uma subclasse de MouseMotionAdapter. Essa classe j define mouseMoved e mouseDragged, ento podemos simplesmente anular mouseDragged para fornecer a funcionalidade de desenho.package com.targettrust.java.capitulo03; import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Painter extends JFrame { private int xValue = -10, yValue = -10; private Container c; public Painter() { super( "Painter" ); c = getContentPane(); c.add(new Label( "Arraste o mouse para desenhar" ), BorderLayout.SOUTH); addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged( MouseEvent e ) { xValue = e.getX(); yValue = e.getY(); repaint(); } } ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 300, 150 ); setVisible(true); } public void paint( Graphics g ) { g.fillOval( xValue, yValue, 4, 4 ); } public static void main( String args[] ) { Painter app = new Painter(); }

} Cdigo 3-6: Cdigo exemplo de classes adaptadoras.

28

Tratamento de Eventos

As variveis de instncia xValue e yValue armazenam as coordenadas do evento mouseDragged. Inicialmente, as coordenadas so configuradas fora da rea de janela para evitar que uma oval seja desenhada na rea de fundo na primeira chamada a paint quando a janela exibida. Registramos um MouseMotionListener para ouvir os eventos de movimento de mouse da janela (lembre-se de que uma chamada para um mtodo que no precedida por uma referncia e por um operador de ponto na realidade precedida por this., indicando que o mtodo chamado para a instncia atual da classe em tempo de execuo). Definimos uma classe interna annima que estende MouseMotionAdapter (que implementa MouseMotionListener). a classe

A classe interna annima herda uma implementao padro dos mtodos mouseMoved e mouseDragged. Portanto, a classe interna annima j satisfaz o requisito de que em todos os mtodos de uma interface devem ser implementados. Entretanto, os mtodos padro no fazem nada quando so chamados. Portanto, anulamos o mtodo mouseDragged para capturar as coordenadas x e y do evento de mouse arrastado e as armazenamos nas variveis de instncia xValue e yValue; ento, chamamos repaint para comear a desenhar a prxima oval no fundo (o que realizado pelo mtodo paint). Registramos um WindowListener para ouvir os eventos de janela da janela de aplicativo (tais como fechar a janela). Definimos uma classe interna annima que estende a classe WindowAdapter (que implementa WindowListener).

29

Tratamento de Eventos

Figura 3-2: Exemplo de utilizao de classes adaptadoras.

A classe interna annima herda uma implementao padro dos sete diferentes mtodos de tratamento de eventos de janelas. Portanto, a classe interna annima j satisfaz o requisito de que uma interface deve ser implementada em todos os mtodos. Entretanto, os mtodos padro no fazem nada quando so chamados. Ento, anulamos o mtodo windowClosing para terminar o aplicativo quando o usurio clica na caixa de fechamento da janela de aplicativo. Repare que, quando voc arrasta o mouse, todos os ovais permanecem na janela. isso devido a um recurso especial dos componentes GUI Swing chamado de buffer duplo em que todo desenho realmente ocorre em uma imagem armazenada na memria, e ento a imagem inteira exibida na janela (ou outro componente GUI). Isso ajuda a melhorar a qualidade grfica em uma GUI Swing. O aplicativo MouseDetails demonstra como determinar o nmero de cliques de mouse (isto , a contagem de cliques) e como distinguir entre diferentes botes do mouse. O ouvinte de eventos nesse programa um objeto da classe interna MouseClickHandler que estende MouseAdapter para possamos definir apenas o mtodo mouseClicked de que precisamos nesse exemplo.

package com.targettrust.java.capitulo03; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MouseDetails extends JFrame { private String s = ""; private int xPos, yPos; public MouseDetails() { super( "Mouse clicks and buttons" ); addMouseListener( new MouseClickHandler() ); setSize( 350, 150 ); show(); } public void paint( Graphics g ) { g.drawString( "Clicked @ [" + xPos + ", " + yPos + "]", xPos, yPos ); } public static void main( String args[] ) { MouseDetails app = new MouseDetails(); 30

Tratamento de Eventos } private class MouseClickHandler extends MouseAdapter { public void mouseClicked( MouseEvent e ) { xPos = e.getX(); yPos = e.getY(); String s = "Clicked " + e.getClickCount() + " vez(s)"; if ( e.isMetaDown() ) s += " com o boto direito do mouse"; else if ( e.isAltDown() ) s += " com o boto do centro"; else s += " com o boto da esquerda"; setTitle( s ); repaint(); } } } Cdigo 3-7: Exemplo de utilizao de classes adaptadoras.

Um usurio de um programa Java pode estar em um sistema com um, dois ou trs botes do mouse. Java fornece um mecanismo para distinguir entre os botes do mouse.

Figura 3-3: Exemplo de utilizao de classes adaptadoras.

A classe MouseEvent herda vrios mtodos de classe InputEvent que podem distinguir entre botes do mouse em um mouse de mltiplos botes ou podem simular um mouse de mltiplos botes com um pressionamento de tecla combinado e dique do boto do mouse.

Os mtodos InputEvent utilizados para distinguir entre cliques do boto do mouse so:Mtodo InputEvent isMetaDown () Descrio Esse mtodo retoma true quando o usurio clica com o boto direito de um mouse com dois ou trs botes. Para simular um clique de boto direito com um mouse de um boto, o usurio pode pressionar a tecla Meta no teclado e clicar no boto31

Tratamento de Eventos

do mouse. Esse mtodo retoma true quando o usurio clica no boto isAltDown ( ) do centro do mouse em um mouse com trs botes. Para simular um clique com o boto do centro do mouse em um mouse com um ou dois botes, o usurio pode pressionar a tecla Alt no teclado e clicar no boto do mouse.Tabela 3-2: Quadro de mtodos InputEvent

Java pressupe que cada mouse contm um boto esquerdo do mouse. Portanto, simples testar um clique com o boto esquerdo do mouse. Entretanto, usurios com mouse de um ou dois botes devem utilizar uma combinao de pressionamentos de teclas no teclado e clicar no mouse ao mesmo tempo para simular os botes ausentes no mouse. No caso de um mouse com um ou dois botes, esse programa pressupe que o boto do centro do mouse clicado se o usurio mantm pressionada a tecla e clica no boto do mouse esquerdo em um mouse de dois botes ou com boto nico do mouse em um mouse de um boto. No caso de um mouse de um boto, esse programa pressupe que o boto direito do mouse clicado se o usurio mantm pressionada a tecla Meta e clica no boto do mouse. O mtodo mouseClicked primeiro captura as coordenadas onde o evento ocorreu e as armazena em variveis de instncia xPos e yPos da classe MouseDetails. Criamos um String contendo o nmero de cliques de mouse (como retomado pelo mtodo MouseEvent getClickCount). A estrutura condicional utiliza os mtodos isMetaDown e isAltDown para determinar qual boto do mouse o usurio clicou e acrescenta um string apropriado para String s em cada caso. O String resultante exibido na barra de ttulo da janela com o mtodo setTitle (herdado na classe JFrame da classe Frame). Chamamos repaint para iniciar uma chamada a paint para desenhar um String na localizao em que o usurio clicou com o mouse.

32

Tratamento de Eventos

Tratando Eventos do TecladoEsta seo apresenta a interface ouvinte de eventos KeyListener para tratar eventos do teclado. Eventos de tecla so gerados quando as teclas no teclado so pressionadas e liberadas. Uma classe que implementa KeyListener deve fornecer definies para os mtodos keyPressed keyReleased e keyTyped, cada uma das quais recebe um KeyEvent como seu argumento. A classe KeyEvent uma subclasse de InputEvent. O mtodo keyPressed chamado em resposta ao pressionamento de qualquer tecla. O mtodo keyTyped chamado em resposta ao pressionamento de qualquer tecla que no uma tecla de ao (por exemplo, uma tecla de seta, , , , , uma tecla de funo, , , , e ). O mtodo keyReleased chamado quando a tecla liberada depois de qualquer evento keyPressed ou keyTyped. Consulte referncia aos mtodos KeyListener. A classe KeyDemo implementa a interface KeyListener, ento todos os trs mtodos so definidos no aplicativo.package com.targettrust.java.capitulo03; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class KeyDemo extends JFrame implements KeyListener { private String line1 = "", line2 = ""; private String line3 = ""; private JTextArea textArea; public KeyDemo() { super( "Demostrando eventos de mouse" ); textArea = new JTextArea( 10, 15 ); textArea.setText( "Pressione uma tecla " ); textArea.setEnabled( false ); addKeyListener( this ); getContentPane().add( textArea ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 350, 100 ); setVisible(true); } public void keyPressed( KeyEvent e ) { line1 = "Key pressed: " + e.getKeyText( e.getKeyCode() ); setLines2and3( e ); 33

Tratamento de Eventos } public void keyReleased( KeyEvent e ) { line1 = "Key released: " + e.getKeyText( e.getKeyCode() ); setLines2and3( e ); } public void keyTyped( KeyEvent e ) { line1 = "Key typed: " + e.getKeyChar(); setLines2and3( e ); } private void setLines2and3( KeyEvent e ) { line2 = "Esta a tecla " + ( e.isActionKey() ? "" : "no " ) + " uma tecla de ao"; String temp = e.getKeyModifiersText( e.getModifiers() ); line3 = "Modificador pressionado: " + ( temp.equals( "" ) ? "nenhum" : temp ); textArea.setText( line1 + "\n" + line2 + "\n" + line3 + "\n" ); } public static void main( String args[] ) { KeyDemo app = new KeyDemo(); } } Cdigo 3-8: Exemplo de tratamento de eventos de teclado.

O construtor registra o aplicativo para tratar seus prprios eventos de tecla com o mtodo addKeyListener. O mtodo addKeyListener definido na classe Component, ento cada subclasse de Component pode notificar KeyListeners de eventos de tecla para esse Component. Adicionamos a JTextArea textArea (onde a sada do programa exibida) ao painel de contedo. Quando um nico Component adicionado a um BorderLayout, o Component ocupa o inteiro Container por default. Os mtodos keyPressed e keyReleased utilizam o mtodo KeyEvent getKeyCode para obter o cdigo de tecla virtual da chave que foi pressionada. A classe KeyEvent mantm um conjunto de constantes o cdigo de tecla virtual constante que representa cada tecla no teclado.

34

Tratamento de Eventos

Figura 3-4: Exemplo de tratamento de eventos do teclado.

Essas constantes podem ser comparadas com o valor de retorno de getKeyCode para testar as teclas individuais no teclado. O valor retornado por getKeyCode passado para o mtodo KeyEvent getKeyText, que retorna um String contendo o nome da tecla que foi pressionada. Para uma lista completa de constantes de tecla virtual, veja a documentao on-line para a classe KeyEvent (pacote java.awtEvent). O mtodo keyTyped utiliza o mtodo KeyEvent getKeyChar para obter o valor Unicode do caractere digitado. Todos os trs mtodos de tratamento de eventos terminam chamando o mtodo setLines2and3 e passando para ele o objeto KeyEvent. Esse mtodo utiliza o mtodo KeyEvent isActionKey para determinar se a tecla no evento era uma tecla de ao. Alm disso, o mtodo InputEvent getModifiers chamado para determinar se quaisquer teclas modificadoras (como , e ) foram pressionadas quando o evento de tecla ocorreu. O resultado desse mtodo passado para o mtodo KeyEvent getKeyModifiersText, que produz um string contendo os nomes das teclas modificadoras pressionadas. Nota: Se voc precisa testar uma tecla especfica no teclado, a classe KeyEvent fornece uma constante de tecla para cada tecla no teclado. Essas constantes podem ser utilizadas a partir dos tratadores de eventos de tecla para determinar se uma tecla particular foi pressionada. Alm disso, para determinar se as teclas , , e so pressionadas individualmente, os mtodos InputEvent isAltDown, IsControlDown, isMetaDown e isShiftDown retornam um boolean indicando se a tecla particular foi pressionada durante o evento de tecla.

35

Tratamento de Eventos

Exerccios1. Para praticar o tratamento de eventos, crie uma interface grfica de uma tela de login de acordo com a figura abaixo:

2. Implemente um listener para realizar o encerramento do processo java criado pelo mtodo main da aplicao quando o usurio clicar no X da janela. 3. Implemente listeners para os botes que possam realizar aes de umclique de mouse. Para o boto sair faa tambm o encerramento do processo. 4. Para o campo de senha implemente um listener que seja capaz de ouvir eventos de teclado. Este deve realizar alguma ao quando a tecla ENTER for pressionada sobre o campo.

36

Tratamento de Eventos

Espao para anotaes

37

Tratamento de Eventos

38

4.Componentes para Interface Grfica

1

Acesso a Banco de Dados

Objetivos Apresentar os componentes mais utilizados em uma GUI Swing Entender a relao entre estes componentes Saber quando utilizar determinado componente Aprender como utilizar dois ou mais componentes em conjunto

2

Acesso a Banco de Dados

JFrameJanelas em uma interface grfica so reas retangulares que podem ser exibidas em qualquer rea da tela. A classe JFrame responsvel pela exibio de janelas para o usurio (conforme ilustrao abaixo) com os recursos mnimos para sua utilizao. Como por exemplo, bordas, barra de ttulos, operaes de minimizar, maximizar, etc.

Figura 4-1: Exemplo de janela JFrame

Para que um JFrame seja exibido, propriedades bsicas devem ser definidas, como as suas dimenses, se estar visvel ou no entre outras. O programa abaixo mostra a criao de um JFrame definindo seu ttulo e dimenses.package com.targettrust.java.capitulo04; import java.awt.event.*; import javax.swing.JFrame; public class JanelaPrincipal extends JFrame { public JanelaPrincipal() { setTitle( "Janela de Exemplo" ); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize( 400, 300 ); setVisible(true); } public static void main(String args[]) { JanelaPrincipal app = new JanelaPrincipal(); }

} Cdigo 4-1: Exemplo de utilizao de JFrame.

3

Acesso a Banco de Dados

O programa acima extende a classe JFrame, tendo como objetivo exibir uma janela na tela do usurio. O mtodo esttico main esta presente para que o programa possa ser executado. Apenas para relembrar, qualquer programa em uma aplicao Java Swing (que no seja applet) inicia sua execuo no mtodo esttico main. No mtodo main encontramos a seguinte: instruo new JanelaPrincipal(). Esta ser responsvel por criar uma nova instncia da classe JanelaPrincipal que um JFrame. A partir deste momento o construtor da classe ser executado e este ir configurar atravs de mtodos da classe JFrame como a mesma ser exibida. A primeira propriedade que o programa ira definir so as dimenses da Janela. Isto feito atravs de chamada ao mtodo setSize() da classe JFrame, este mtodo pode ser chamado recebendo como parmetro um objeto java.awt.Dimension ou diretamente com dois inteiros, o primeiro definindo a largura e o segundo a altura. Caso as dimenses no sejam definidas (mtodo setSize()), ser criada uma janela com dimenses nulas (zero de largura e zero de altura). Em seguida o ttulo ser definido com a chamada a setTitle();. Este mtodo ir definir como ttulo a String recebida como parmetro. Antes de a janela ser exibida, deve ser decidido o que o programa ir realizar quando for efetuada uma operao de fechar a janela. No AWT fazia-se necessrio implementar um evento com o cdigo responsvel pela operao de fechar a janela. No Swing foi criado um novo mtodo que pode realizar operaes padroes de fechamento. Para utilizar estas funes padro foi adicionado o mtodo setDefaultCloseOperation(). Este pode receber como parmetro as constantes da tabela abaixo:

DO_NOTHING_ON_CLOS E HIDE_ON_CLOSE

DISPOSE_ON_CLOSE EXIT_ON_CLOSE

No realiza nenhuma operao quando a janela for fechada. Automticamente oculta a janela quando esta for fechada atravs de uma chamada ao mtodo hide(). Automaticamente esconde e descarta a janela. Atravs de uma chamada ao mtodo dispose(). Termina a aplicao atravs do mtodo System.Exit(0).4

Acesso a Banco de Dados Tabela 4-1: Operaes padres de fechamento de janela

No programa EXIT_ON_CLOSE.

exemplo,

foi

utilizada

o

mtodo

de

sada

padro

Neste ponto do programa, as propriedades bsicas para exibio de uma janela j esto definidas ento deve ser executada uma instruo para exibir a janela na tela atravs do mtodo show().

5

Acesso a Banco de Dados

JLabel

Os rtulos fornecem instrues de texto ou informaes sobre uma GUI. Os rtulos so definidos com a classe JLabel - uma subclasse de JComponent. Um rtulo exibe uma nica linha de texto de leitura. Uma vez que os rtulos so criados, os programas raramente alteram um contedo do rtulo.

package com.targettrust.java.capitulo04; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class LabelTest extends JFrame { private JLabel label1, label2, label3; public LabelTest() { super( "Testing JLabel" ); Container c = getContentPane(); c.setLayout( new FlowLayout() ); label1 = new JLabel( "Label com texto" ); label1.setToolTipText( "Tool tip de um label" ); c.add( label1 ); Icon javalogo = new ImageIcon(getClass().getResource("javalogo2.gif")); label2 = new JLabel("Label com texto e imagem", javalogo, SwingConstants.LEFT ); label2.setToolTipText( "Tool tip de um label" ); c.add( label2 ); label3 = new JLabel(); label3.setText( "Label com texto e icone abaixo" ); label3.setIcon( javalogo ); label3.setHorizontalTextPosition( SwingConstants.CENTER ); label3.setVerticalTextPosition( SwingConstants.BOTTOM ); c.add( label3 ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 275, 170 ); setVisible(true); {

}

public static void main( String args[] ) LabelTest app = new LabelTest(); } } Cdigo 4-2: Exemplo de utilizao de JLabel.

6

Acesso a Banco de Dados

O programa declara trs referncias JLabel. Os objetos JLabel so instanciados no construtor. A instruo new cria um objeto JLabel com o texto "Label with text". O texto exibido no rtulo automaticamente. O mtodo setToolTipText (herdada na classe JLabel da classe JComponent) especifica uma dica de ferramenta que exibida automaticamente quando o usurio posiciona o cursor do mouse sobre o rtulo na GUI. Quando executar esse programa, tente posicionar o mouse sobre cada rtulo para ver sua dica de ferramenta. O mtodo add adiciona label1 ao painel de contedo. Muitos componentes Swing podem exibir imagens especificando um cone como um argumento para seu construtor ou utilizando um mtodo que normalmente chamado de setIcon. Um Icon um objeto de qualquer classe que implementa a interface Icon (pacote javax.swing). Uma dessas classes ImageIcon (pacote javax.swing), que suporta dois formatos de imagem - Graphics Interchange Format (GIF) e Joint Photographic Experts Group (JPEG). Os nomes de arquivo para cada um desses tipos possuem extenes gif ou jpg (ou jpeg), respectivamente. O arquivo javalogo.gif contm a imagem para carregar e armazenar no objeto ImageIcon. Pressupe-se que esse arquivo esteja no mesmo diretrio que o programa. O objeto ImageIcon atribuido referncia Icon bug. Lembrese, a classe ImageIcon implementa a interface Icon, portanto um ImageIcon um Icon.

Figura 4-2: Exemplo de JLabel

A classe JLabel suporta a exibio de Icons. O construtor JLabel utilizado para criar um rtulo que exibe o texto "Label with text and icon" e o Icon que logojava referencia, e alinhado esquerda (isto , o icone e o texto esto o lado esquerdo da rea do rtulo na tela). A interface SwingConstants (pacote javax.swing) define um conjunto de constantes inteiras comuns (como SwingConstants LEFT) que so utilizadas com muitos componentes Swing. Por default, o texto aparece direita da imagem quando um rtulo contm tanto texto como imagem. Os alinhamentos horizontal e vertical de um rtulo podem ser configurados com os mtodos setHorizontalAlignment e setVerticalAligninent,7

Acesso a Banco de Dados

respectivamente. A dica de ferramenta adicionada para label2 e adicionamos label2 ao painel de contedo. A classe JLabel fornece muitos mtodos para configurar um rtulo depois que ele foi instanciado. Cria-se um JLabel e invocamos o construtor sem argumentos (padro). Esse rtulo no tem texto ou Icon. Utiliza-se o mtodo JLabel setText para configurar o texto exibido no rtulo. Um mtodo correspondente getText recupera o texto atual exibido em um rtulo. Utilizamos um mtodo JLabel setIcon para configurar o Icon exibido no rtulo. Um mtodo correspondente getIcon recupera o Icon atual exibido em um rtulo. Utilizamos os mtodos JLabel setHorizontalTextPosition e setVerticalTextPosition para especificar a posio do texto no rtulo. As instrues precedentes indicam que o texto ser centralizado horizontalmente e aparecer na parte inferior do rtulo. Portanto, o Icon aparecer acima do texto.Configuramos o texto de dica de ferramenta para o label3 e aps adicionamos label3 ao painel de contedo.

8

Acesso a Banco de Dados

JButtonUm boto um componente em que o usurio clica para acionar uma ao especfica. Um programa Java pode utilizar vrios tipos de botes, incluindo botes de comando, caixas de seleo, botes de alternao e botes de opo. Consulte a documentao SDK na qual mostra a hierarquia de herana dos botes do Swing que abordaremos neste tem. Todos os tipos de boto so subclasses de AbstractButton (pacote javax.swing), o qual define muitos dos recursos que so comuns aos botes do Swing. Um boto de comando gera um ActionEvent quando o usurio clica no boto com o mouse. Os botes de comando so criados com a classe JButton, que herda da classe AbstractButton. O texto na face de um JButton chamado de rtulo de boto (caption). Uma GUI pode ter muitos JButtons, mas cada rtulo de boto em geral deve ser nico. O aplicativo abaixo cria dois JButtons e demonstra que JButtons (como JLabels) suportam a exibio de cones. O tratamento de eventos para os botes realizado por uma nica instncia de classe interna ButtonHandler.package com.targettrust.java.capitulo04; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ButtonTest extends JFrame { private JButton plainButton, fancyButton; private class ButtonHandler implements ActionListener { public void actionPerformed( ActionEvent e ) { JOptionPane.showMessageDialog( null, "Voc pressionou: " + e.getActionCommand() ); } } public ButtonTest() { super( "Testando botes" ); Container c = getContentPane(); c.setLayout( new FlowLayout() ); plainButton = new JButton( "Boto sem cone" ); c.add( plainButton ); Icon bug1 = new ImageIcon( getClass().getResource("javalogo1.gif") ); Icon bug2 = new ImageIcon( getClass().getResource("javalogo2.gif") ); fancyButton = new JButton( "Fancy Button", bug1 ); fancyButton.setRolloverIcon( bug2 ); 9

Acesso a Banco de Dados

c.add( fancyButton ); ButtonHandler handler = new ButtonHandler(); fancyButton.addActionListener( handler ); plainButton.addActionListener( handler ); pack(); setVisible(true);

}

public static void main( String args[] ) { ButtonTest app = new ButtonTest(); } } Cdigo 4-3: Exemplo de utilizao de JButton.

Declaramos duas referncias para as instncias de classe JButton plainButton e fancyButton (que so instanciadas no construtor). Criamos plainButton com o rtulo de boto PlainButton e adicionamos o boto ao painel de contedo. Um JButton pode exibir cones. Para fornecer ao usurio um nvel extra de interatividade visual com a GUI, um JButton tambm pode ter um cone rollover, ou seja, um cone que exibido quando o mouse posicionado sobre o boto. O cone no boto altera-se quando o mouse se move para dentro e para fora da rea do boto na tela. Criamos dois objetos ImageIcon que representam o Icon padro e o Icon rollover para o JButton criado. Ambas as instrues pressupem que os arquivos de imagem so armazenados no mesmo diretrio que o programa (que geralmente o caso para aplicativos que utilizam imagens). Criamos fancyButton com texto-padro Fancy Button e o Icon bug1. Por default, o texto exibido direita do cone. Utilizamos o mtodo setRolloverIcon (herdado da classe AbstractButton na classe JButton) para especificar a imagem exibida no boto quando o usurio posiciona o mouse sobre o boto. Adicionamos o boto ao painel de contedo.

Figura 4-3: Exemplo de JButton 10

Acesso a Banco de Dados

JButtons (como JTextFields) geram ActionEvents. Como mencionado anteriormente, um ActionEvent pode ser processado por qualquer objeto ActionListener. Registramos um objeto ActionListener para cada JButton. A classe interna ButtonHandler define actionPerformed para exibir um caixa de dilogo de mensagem contendo o rtulo para o boto que foi pressionado pelo usurio. O mtodo ActionEvent getActionCommand retoma o rtulo do boto que gerou o evento.

11

Acesso a Banco de Dados

JTextField e JPasswordField

JTextFields e JPasswordFields (pacote javax.swing) so reas de uma nica linha em que o texto pode ser inserido via teclado pelo usurio ou o texto pode ser simplesmente exibido. Um JPasswordField mostra que um caractere foi digitado quando o usurio insere os caracteres, mas oculta os caracteres assumindo que eles representam uma senha que deve permanecer conhecida apenas para o usurio. Quando o usurio digita os dados em um JTextField ou JPasswordField e pressiona a tecla Enter, um evento de ao ocorre. Se um ouvinte de evento registrado, o evento processado e os dados no JTextField ou JPasswordField podem ser utilizados no programa. A classe JTextField estende a classe JTextComponent (pacote javax.swing.text), que fornece muitos recursos comuns para os componentes baseados em texto do Swing. A classe JPasswordField estende JTextField e adiciona vrios mtodos que so especificos ao processamento de senhas. O aplicativo de exemplo utiliza as classes JTextField e JPasswordField para criar e manipular quatro campos. Quando o usurio pressiona Enter no campo atualmente ativo (o componente atualmente ativo "tem o foco"), uma caixa dilogo de mensagem contendo o texto no campo exibida. Quando um evento ocorre no JPasswordField, a senha revelada.package com.targettrust.java.capitulo04; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TextFieldTest extends JFrame { private JTextField text1, text2, text3; private JPasswordField password; public TextFieldTest() { super( "Testando JTextField e JPasswordField" ); Container c = getContentPane(); c.setLayout( new FlowLayout() ); text1 = new JTextField( 10 ); c.add( text1 ); text2 = new JTextField( "Digite um texto aqui: " ); c.add( text2 );

12

Acesso a Banco de Dados text3 = new JTextField( "Campo no editvel", 20 ); text3.setEditable( false ); c.add( text3 ); password = new JPasswordField( "Sua senha" ); c.add( password ); TextFieldHandler handler = new TextFieldHandler(); text1.addActionListener( handler ); text2.addActionListener( handler ); text2.addMouseListener( handler ); text3.addActionListener( handler ); addMouseWheelListener(handler); password.addActionListener( handler ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 325, 100 ); setVisible(true); } public static void main( String args[] ) { TextFieldTest app = new TextFieldTest(); } private class TextFieldHandler implements ActionListener, MouseListener, MouseWheelListener { public void actionPerformed( ActionEvent e ) { String s = ""; if ( e.getSource() == text1 ) s = "text1: " + e.getActionCommand(); else if ( e.getSource() == text2 ) s = "text2: " + e.getActionCommand(); else if ( e.getSource() == text3 ) s = "text3: " + e.getActionCommand(); else if ( e.getSource() == password ) { s = "password: " + e.getActionCommand(); } } JOptionPane.showMessageDialog( null, s );

public void mouseClicked(MouseEvent e) { text2.setText(""); } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseWheelMoved(MouseWheelEvent e) { JOptionPane.showMessageDialog( null, "Wheel!!!!" ); } 13

Acesso a Banco de Dados } } Cdigo 4-4: Exemplo de utilizao de JTextField e JPasswordField.

So declaradas trs referncias a JTextFields (text1, text2 e text3) e um JPasswordField (password). Cada uma delas instanciada no construtor. Defnimos JTextField text1 com 10 colunas de texto. A largura do campo de texto ser a largura em pixels do caractere mdio na fonte atual do campo de texto multiplicado por 10. Adicionamos text1 ao painel de contedo. Definimos JTextField text2 com o texto inicial "Enter text here" para exibir no campo de texto. A largura do campo de texto determinada pelo texto. Adicionamos text2 ao painel de contedo. Definimos JTextField text3 e chamamos o construtor JTextField com dois argumentos - o texto-padro "Uneditable textfield" para exibir no campo de texto e o nmero de colunas (20).A largura do campo de texto determinada pelo nmero de colunas especificadas.

Figura 4-4: Exemplo de JTextField e JPasswordField

Utilizamos o mtodo setEditable (herdado no JTextField da classe JTextComponent) para indicar que o usurio no pode modificar o texto no campo de texto. Adicionamos text3 ao painel de contedo. Definimos JPasswordField password com o texto "Hidden text" para exibir no campo de texto. A largura do campo de texto determinada pelo texto. Repare que o texto exibido como uma string de asteriscos quando o programa executa. Adicionamos password ao painel de contedo. Para o tratamento de eventos nesse exemplo, definimos a classe interna TextFieldHandler. O tratador da classe JTextField (discutido em detalhe brevemente) implementa a interface ActionListener. Portanto, cada instncia da classe TextFieldHandler um ActionListener.14

Acesso a Banco de Dados

Definimos uma instncia da classe TextFieldHandler e a atribui referencia handler. Essa instncia ser utilizada como o objeto ouvinte de eventos para os JTextFields e o JPasswordField nesse exemplo. Aps instrues de registro de evento que especificam o objeto ouvinte de eventos para cada um dos trs JTextFields e para o JPasswordField so especificadas. Depois que essas instrues executam, o objeto que handler referencia est ouvindo eventos (isto , ser notificado quando um evento ocorrer) nesses quatro objetos. Em cada caso, o mtodo addActionListener da classe JTextField chamado para registrar o evento. O mtodo addActionListener recebe como seu argumento um objeto ActionListener. Portanto, qualquer objeto de uma classe que implemente a interface ActionListener (isto , qualquer objeto que um ActionListener ) pode ser fornecido como um argumento para esse mtodo. O objeto que handler referencia um ActionListener porque sua classe implementa a interface ActionListener. Agora, quando o usurio pressiona Enter em qualquer desses quatro campos, o mtodo actionPerformed na classe TextFieldHandler chamado para tratar o evento. O mtodo actionPerformed utiliza seu mtodo ActionEvent do argumento getSource para determinar o componente GUI com o qual o usurio interagiu e cria um String para exibir em uma caixa de dilogo de mensagem. O mtodo ActionEvent getActionCommand retorna o texto no JTextField que gerou o evento. Se o usurio interagiu com o JPasswordField, Instrues realizam a coero da referncia de Component retornada por e.getSource() para uma referncia JPasswordField de modo utilizamos o mtodo JPasswordField getPassword para obter a senha e criar o String a ser exibido. O mtodo getPassword retorna a senha como um array de tipo char que utilizado como um argumento para um construtor de String para criar um String. Exibimos uma caixa de mensagem indicando o nome de referncia do componente GUI e o texto que o usurio digitou no campo. Observe que mesmo um JTextField no editvel pode gerar um evento. Tambm observe que o texto real da senha exibido quando se pressiona Enter no JPasswordField ( claro que normalmente voc no faria isso!) Utilizar uma classe separada para definir um ouvinte de eventos uma prtica de programao comum para separar a interface GUI da implementao de seu tratador de evento.

15

Acesso a Banco de Dados

JTextArea

A classe JTextArea destinada a exibir uma rea para manipulao de mltiplas linhas de texto. Da mesma forma que a classe JTextField, esta classe herda JTextComponent.package com.targettrust.java.capitulo04; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TextAreaTest extends JFrame { private String texto2; private String texto; private JTextArea txtArea1; private JTextArea txtArea2; private Container c; public TextAreaTest() { texto2 = new String(""); texto = new String("Digite aqui"); txtArea1 = new JTextArea(texto, 10, 15); txtArea2 = new JTextArea(texto2, 10, 15); c = getContentPane(); // Define o gerenciador de layout a ser utilizado e suas propriedades FlowLayout layout = new FlowLayout(); c.setLayout(layout); layout.setAlignment(FlowLayout.LEFT); // Define as propriedades da janela que sera exibida setSize( 400, 300 ); setTitle("Utilizando JTextArea"); // Define a operacao padrao para fechamento (encerrar programa) setDefaultCloseOperation(EXIT_ON_CLOSE); // Cria a JTextArea 1 c.add(txtArea1); // Adiciona barra de rolagem na JTextArea getContentPane().add(new JScrollPane(txtArea1)); // Adiciona o botao de copiar somente o texto selecionado JButton copiarSelecionado = new JButton("Copiar Selecionado"); c.add(copiarSelecionado); // Adiciona o botao de copiar todo o texto selecionado JButton copiarTudo = new JButton("Copiar Tudo"); c.add(copiarTudo); // Cria a JTextArea 2 c.add(txtArea2); 16

Acesso a Banco de Dados // Adiciona barra de rolagem na JTextArea c.add(new JScrollPane(txtArea2)); // Adiciona os eventos aos botoes copiarTudo.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { txtArea2.setText(txtArea1.getText()); } } ); copiarSelecionado.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { txtArea2.setText(txtArea1.getSelectedText()); } } ); // Exibe a janela na tela setVisible(true);

}

public static void main(String args[]) { TextAreaTest app = new TextAreaTest(); } } Cdigo 4-5: Exemplo de utilizao de JTextArea.

O programa acima exemplifica a utilizao de um JTextArea atravs da criao de um programa simples que exibe duas caixas de texto (JTextArea) na tela e dois botes (JButton). Os botes no exemplo permitem duas operaes. O primero boto chamado Copiar Tudo quando clicado ira copiar o texto digitado na primeira JTextArea para a segunda JTextArea. O segundo boto chamado Copiar Selecionado quando acionado ir copiar somente o texto selecionado na primeira JTextArea para a segunda JTextArea. A imagem abaixo mostra a tela do programa exemplo:

17

Acesso a Banco de Dados

Figura 4-5: Imagem da tela do programa de exemplo de JTextArea.

No programa, declaramos duas JTextArea, uma chamada txtArea1, e outra chamada txtArea2. Instanciamos as duas atravs da operao new JTextArea() que recebe como parmetro o texto inicial da caixa de texto, o nmero de linhas e o nmero de colunas. Inicializamos a txtArea1 com o texto Digite aqui e a caixa txtArea2 sem texto inicial. O programa adiciona a as duas caixas de texto uma barra de rolagem (JScrollPane). Alm disso, so criados dois botes (conforme j visto no tpico sobre JButton) os quais ao serem clicados realizam diferentes operaes. Ambos os botes inserem texto na segunda JTextArea atravs do mtodo setText. Para realizar esta operao (definir o texto da segunda JTextArea objeto txtArea2) o primeiro boto (Copiar Tudo) realiza uma chamada ao mtodo getText() da primeira JTextArea (objeto txtArea1) copiando desta forma todo o texto da primeira para a segunda caixa de texto. J o segundo boto, utiliza-se do mtodo getSelectedText() para copiar apenas o texto selecionado da primeira para a segunda caixa de texto.

A tabela abaixo exibe alguns mtodos teis e sua funo na classe JTextArea. insert(String str, int pos) replaceRange(String str, int start, int end) setTabSize(int size) setFont(Font f) Insere o texto na posio expecificada. Substitui o texto pelo informado no primeiro parmetro, da posio inicial at a final. Define o tamanho da tabulao (quando pressionado a tecla TAB). Define a fonte utilizada na caixa de texto.

Tabela 4-2: Mtodos principais da classe JTextArea.

18

Acesso a Banco de Dados

JPanel

Ao desenvolver interfaces mais complexas, cada componente dever ser colocado em um local exato para que a aplicao fique com uma GUI interessante para o usurio. Para conseguir localiza-los em posies exatas, torna-se necessria a utilizao de reas ou grupos de componentes. Estes so chamados de painis. Os painis so controlados pela classe JPanel que uma subclasse de JComponent. Resumindo, um painel um agrupamento de componentes, sendo que estes componentes podem ser at mesmo outros painis.

Figura 4-6: Exemplo de utilizao de JPanel.

Na imagem acima verificamos a utilizao de um JPanel, esta GUI mostra a utilizao de dois painis com dois diferentes gerenciadores de layout. O primeiro painel utilizando BorderLayout e o segundo utilizando GridLayout.package com.targettrust.java.capitulo04; import java.awt.*; import javax.swing.*; public class Paineis extends JFrame { public Paineis() { 19

Acesso a Banco de Dados getContentPane().setLayout(new BorderLayout()); JPanel painelGrid = new JPanel(); GridLayout layout = new GridLayout(1, 3); painelGrid.setLayout(layout); setTitle("Exemplo de Paineis"); JButton esquerda = new JButton("Esquerda"); JButton meio = new JButton("Meio"); JButton direita = new JButton("Direita"); painelGrid.add(esquerda); painelGrid.add(meio); painelGrid.add(direita); getContentPane().add(painelGrid, BorderLayout.SOUTH); setSize( 400, 300 ); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public static void main(String args[]) { Paineis app = new Paineis(); } } Cdigo 4-6: Utilizao de painis com JPanel.

No programa acima, a primeira linha do construtor modifica o painel padro do JFrame para um BorderLayout atravs do mtodo getContentPane().setLayout(). Este procedimento define o primeiro gerenciador de layout a ser utilizado no primeiro painel. Logo em seguida realizada a declarao de um novo painel utilizando-se da classe JPane e tambm definido um novo gerenciador de layout o GridLayout e aps as duas declaraes associado ao segundo painel o GridLayout. So instanciados quatro objetos, trs botes e uma caixa de texto. Os botes so adicionados ao segundo painel atravs do mtodo add() do painel, j a caixa de texto associada ao primeiro painel atravs do mesmo mtodo. Ao final o segundo painel (contendo os botes) adicionado na regio sul do primeiro painel atravs do mtodo add(), com isso faz com que a caixa de texto expanda-se por toda a regio norte do primeiro painel.

20

Acesso a Banco de Dados

JComboBoxUma caixa de combinao (ou combo box, s vezes tambm chamada de lista drop-down) fornece uma lista de itens entre os quais o usurio pode escolher. As caixas de combinao so implementadas com a classe JComboBox, que herda da classe JComponent. JComboBoxs geram ItemEvents como JCheckBoxs e JRadioButtons.package com.targettrust.java.capitulo04; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxTest extends JFrame { private JComboBox images; private JLabel label; private String names[] = {"img1.gif", "img2.gif", "img3.gif", "img4.gif"}; private Icon icons[] = { new ImageIcon( getClass().getResource(names[ 0 ] ) ), new ImageIcon( getClass().getResource(names[ 1 ] ) ), new ImageIcon( getClass().getResource(names[ 2 ] ) ), new ImageIcon( getClass().getResource(names[ 3 ] ) ) }; public ComboBoxTest() { super( "JComboBox" ); Container c = getContentPane(); c.setLayout( new FlowLayout() ); images = new JComboBox( names ); images.setMaximumRowCount( 3 ); images.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { label.setIcon( icons[ images.getSelectedIndex() ] ); } } ); c.add( images ); label = new JLabel( icons[ 0 ] ); c.add( label ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 350, 100 ); setVisible(true); } public static void main( String args[] ) { ComboBoxTest app = new ComboBoxTest(); }

} Cdigo 4-7: Exemplo de utilizao de JComboBox.

21

Acesso a Banco de Dados

Atravs deste exemplo podemos verificar a utilizao de um JComboBox a fim de fornecer uma lista de quatro nomes de arquivo de imagem. Quando um nome de arquivo de imagem selecionado, a imagem correspondente exibida como um Icon em um JLabel. Declaramos e inicializamos o array de cones de com quatro novos objetos ImageIcon. O array String names contm os nomes dos quatro arquivos de imagem que so armazenados no mesmo diretrio que o aplicativo. Criamos um objeto JComboBox utilizando os Strings no array names como os elementos na lista. Um ndice numrico monitora a ordem de itens na JComboBox. O primeiro item adicionado no ndice 0; o prximo item adicionado no ndice 1, etc. O primeiro item adicionado a uma JComboBox aparece como o item atualmente selecionado quando a JComboBox exibida. Outros itens so selecionados clicando na JComboBox. Quando clicada, a JComboBox expande em uma lista na qual o usurio pode fazer uma seleo. Utilizamos o mtodo JComboBox setMaximumRowCount para estabelecer o nmero mximo de elementos que so exibidos quando o usurio clica na JComboBox. Se houver mais itens na JComboBox que o nmero mximo de elementos que so exibidos, a JComboBox fornece automaticamente uma barra de rolagem que permite ao usurio visualizar todos os elementos na lista.

Figura 4-7: Exemplo de JComboBox

O usurio pode clicar nas setas de rolagem na parte superior e inferior da barra de rolagem para mover-se para cima e para baixo pela lista, um elemento por vez, ou o usurio pode arrastar a caixa de rolagem no meio da barra de rolagem para cima e para baixo para mover-se pela lista. Para arrastar a caixa de rolagem, mantenha o boto do mouse pressionado com o cursor de mouse na caixa de rolagem e mova o mouse. Registramos uma instncia de uma classe interna annima que implementa ItemListener como o ouvinte para JComboBox images. Quando o usurio faz uma seleo de imagens, o mtodo itemStateChanged configura o22

Acesso a Banco de Dados

Icon como label. O Icon selecionado do array icons determinando o nmero do ndice do item selecionado no JComboBox atravs do mtodo getSelectedlndex.

23

Acesso a Banco de Dados

Construindo MenusEm qualquer GUI os menus so fundamentais, pois permitem ao usurio realizar aes sem deixar uma tela confusa com muitos itens ou botes descnecessrios. Os menus se dividem em dois tipos bsicos, as barras de menu e os menus popup ou menus de contexto.

24

Acesso a Banco de Dados

Barras de Menus (JMenuBar)A classe JMenuBar tem por objetivo gerenciar uma barra de menus. Uma barra de menus comumente utilizada em aplicaes, estando localizada abaixo do ttulo da janela. No Swing uma barra de menu somente podem ser associados a classes que possuam o mtodo setJMenuBar, as classes em que mais comumente utilizamos menus so JFrame e JApplet. A ilustrao abaixo exemplifica o funcionamento dos objetos de menu:

Figura 4-8: Classes utilizadas em uma barra de menus.

Conforme verificamos na ilustrao acima, temos um primeiro crculo delimitando uma rea JMenuBar. Esta rea o espao para o menu, ou seja esta classe quem indica qual vai ser o tipo do menu, neste caso uma barra de menu. Logo em seguida verificqmos um indicativo para a classe JMenu, esta classe responsvel por agrupar itens de um menu como no exemplo acima agrupar as cores do texto ou as funes de arquivo. Um menu no necessariamente precisa de uma classe JMenu, pode-se associar diretamente os itens a JMenuBar. Esta classe pode ser utilizada em todos os tipos de menus no ficando restrita apenas as barras como veremos mais a frente. Dentro dos grupos de menu (JMenu) esto colocados os itens (JMenuItem), esta a parte funcional e programvel do menu, ou seja estes so os objetos que so a pondo fi