Vous êtes sur la page 1sur 195

Java Avançado com acesso JDBC a Banco de Dados, Arquivos, Swing e Eventos

Java Avançado

Sumário

1. Frameworks para interfaces gráficas

1

Objetivos

2

Abstract Window Toolkit (AWT)

3

Swing

4

Exercícios

7

2. Gerenciadores de Layout

1

Objetivos

2

Introdução

3

FlowLayout

4

BorderLayout

6

GridLayout

9

Exercícios

11

3. Tratamento de Eventos

13

Objetivos

14

Listeners

15

Formas de Tratamento de Eventos

16

Eventos de Mouse

23

Exercícios

36

4. Componentes para Interface Gráfica

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 Diálogo

36

JOptionPane

37

JTable

41

JScrollPane

44

JFileChooser

46

Exercícios

48

5. Look And Feel

1

Objetivos

2

Aparência e Comportamento

3

Exercícios

6

6. Arquivos

1

Frameworks para interfaces gráficas

 

Objetivos

2

Introdução

3

Hierarquia de Dados

4

Arquivos e Fluxos

7

Testando Arquivos

13

Criando um Arquivo

16

Lendo Dados de um Arquivo

25

Gerenciamento de memória: Garbage Collector

34

Exercícios

35

7.

Acesso a Banco de Dados

1

Objetivos

1

Introdução

2

JDBC Drivers

3

Aplicação 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 Transações

48

Exercícios

49

1.1.FFrameworksrameworks parapara interfaceinterfacess gráficasgráficas

Frameworks para interfaces gráficas

Objetivos

Conhecer os diferentes frameworks existentes para construção de interfaces gráficas

Enteder as relações e a evolução destes frameworks

Conhecer as diferenças entre estes frameworks

Frameworks para interfaces gráficas

Abstract Window Toolkit (AWT)

O framework AWT (Abstract Window Toolkit – pacote java.awt) foi a primeira interface gráfica moderna e difundida para a linguagem Java.

Tendo como características possuir componentes de “peso pesado”, ou seja, componente que estão associados diretamente a capacidade da plataforma local apresenta como problema principal as diferenças de interação com o usuário sensitivas a plataforma.

Este framework serviu de “base” para a construção do Swing que utiliza alguns de seus recursos. Atualmente este pacote é utilizado para completar partes que não foram re-escritas em Swing.

Em todo programa Swing sempre haverá alguma classe AWT sendo utilizada pois existem eventos e componentes que não foram re- implementados no Swing pelo AWT já atender as necessidades.

Frameworks para interfaces gráficas

Swing

As classes que são utilizadas para criar os componentes são parte dos componentes GUI do Swing do pacote javax.swing. Esses são os mais novos componentes GUI da plataforma do Java 2.

DICA: Uma forma fácil de diferenciar classes Swing de classes AWT é pelo seu prefixo, todas classes Swing inicial com a letra “J”.

Os componentes Swing (como são comumente denominados) são escritos, manipulados e exibidos completamente em Java (chamados componentes Java puros).

Os componentes GUI originais do pacote java.awt (Abstract Windowing

Toolkit - também chamado de AWT) estão diretamente associados com as capacidades de GUI da plataforma local. Então, um programa Java executando em diferentes plataformas Java tem uma aparência diferente e, às vezes, até diferentes interações de usuário em cada plataforma. Juntos, o aspecto e a maneira como o usuário interage com o programa são conhecidos como aparência e comportamento ("look and feel") desse programa.

Os componentes do Swing permitem ao programador especificar uma

aparência e um comportamento diferente para cada plataforma, ou uma aparência e um comportamento uniforme entre todas as plataformas, ou até mesmo alterar a aparência e comportamento enquanto o programa está executando.

Os componentes Swing são freqüentemente referidos como componentes de peso leve - são completamente escritos em Java de modo a não "serem pesados" pelas complexas capacidades GUI da plataforma em que são utilizados.

dos

componentes Swing) que são vinculados à plataforma local são correspondentemente chamados de componentes de peso pesado - contam

com o sistema de janela da plataforma local para determinar sua funcionalidade e sua aparência e comportamento.

Os

componentes

AWT

(muitos

dos

quais

são

equivalentes

Cada componente de peso pesado tem um "peer" (um equivalente do pacote java.awt.peer) que é responsável pelas interações entre o componente e a plataforma local para exibir e manipular o componente. Vários componentes Swing ainda são componentes de peso pesado.

Em particular, as subclasses de java.awt.Window que exibem janelas na

tela ainda requer em interação direta com o sistema local de janelas.

A hierarquia

de

herança

das

classes

que

define

atributos

e

comportamentos que são comuns para a maioria dos componentes Swing.

Frameworks para interfaces gráficas

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 métodos que podem ser aplicados a um

objeto de qualquer subclasse de Component. Dois dos métodos que se originam na classe Component são paint e repaint.

É importante entender os métodos de classe Component, porque grande

parte da funcionalidade herdada por cada subclasse de Component é definida originalmente pela classe Component. As operações comuns para a maioria dos componentes GUI (tanto Swing como AWT) estão localizadas na classe Component.

Um Container é uma coleção de componentes relacionados. Em aplicativos com JFrames e em Applets, anexamos os componentes ao painel de conteúdo - um Container. A classe Container define o conjunto de métodos que podem ser aplicados a um objeto de qualquer subclasse de Container.

Um método que se origina na classe Container é add. Outro método 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 métodos que pode ser aplicado a um objeto de qualquer subclasse de JComponent.

Os componentes Swing que derivam da subclasse JComponent têm muitos recursos, incluindo:

Frameworks para interfaces gráficas

Uma aparência e um comportamento plugável, que podem ser utilizados para personalizar a aparência e o comportamento quando o programa executa em plataformas diferentes.

Teclas de atalho (chamadas de mnemónicas) para acesso direto a componentes GUI pelo teclado.

Capacidades comuns de tratamento de eventos para casos onde vários componentes GUI iniciam as mesmas ações em um programa.

Breves descrições do propósito de um componente GUI (chamadas de dicas de ferramenta). Elas são exibidas quando o cursor de mouse é posicionado sobre o componente por um breve instante.

Suporte a tecnologias de auxilio ao deficiente físico como leitores de tela de braile para pessoas cegas.

Suporte para localização de interface com o usuário - personalizando a

e

interface

com

o

usuário

para

exibir

em

diferentes

idiomas

convenções culturais.

Frameworks para interfaces gráficas

Exercícios

1. Explique a relação existente entre Swing e AWT.

2. Qual a diferença entre componentes de “peso pesado” e componentes de “peso leve”?

3. Como identificar facilmente pelo nome de uma classe de interface gráfica se esta faz parte do Swing ou AWT?

Frameworks para interfaces gráficas

Espaço para anotações

2.2.GerenciadGerenciadoresores dede LaLayoutyout

Tratamento de Eventos

Objetivos

Apresentar os principais gerenciadores de layout de interface gráfica

BorderLayout

FlowLayout

GridLayout

Discutir as principais implementações de layout

Identifir a melhor implementação de acordo com o foco de utilização

Tratamento de Eventos

Introdução

Os gerenciadores de layout são fornecidos para organizar componentes GUI em um conteiner para propósitos de apresentação. Eles fornecem capacidades básicas de layout que são mais fáceis de utilizar do que determinar a posição e o tamanho exatos de cada componente GUI. Isso permite ao programador concentrar-se na “aparência e comportamento” básicos e deixar os gerenciadores de layout processar a maioria dos detalhes de layout.

Alguns designers de GUI também permitem ao programador utilizar os gerenciadores de layout descritos abaixo:

Gerenciador de Layout

FlowLayout

BorderLayout

GridLayout

Descrição

Padrão para java.awt.Applet, java.awt.Panel e javax.swing.JPanel. Coloca os componentes seqüencialmente (da esquerda para a direita) na ordem que foram adicionados. Também é possível especificar a ordem dos componentes utilizando o método add de Container que aceita um Component e uma posição de índice inteiro como argumentos.

Padrão para os painéis de conteúdo 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.

Tabela 2-1: Descrição dos gerenciadores de layout

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

Tratamento de Eventos

FlowLayout

FlowLayout é o gerenciador de layout mais básico. Os componentes GUI são colocados em um conteiner da esquerda para a direita na ordem em que são adicionados ao mesmo. Quando a borda do conteiner é alcançada, os componentes continuam na próxima linha.

A classe FlowLayout permite aos componentes GUI ser alinhados à esquerda, centralizados (o padrão) 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 );

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();

}

}

Código 2-1: Exemplo de utilização de FlowLayout.

O aplicativo de exemplo cria três objetos JButton e os adiciona ao aplicativo que utiliza um gerenciador de layout FlowLayout.

Os componentes são automaticamente alinhados no centro. Quando o usuário clica em Left, o alinhamento para o gerenciador de layout é alterado para um FlowLayout alinhado à esquerda. Quando o usuário clica em Right, o alinhamento para o gerenciador de layout é alterado para um FlowLayout alinhado à direita. Quando o usuário clica em Center, o alinhamento para o gerenciador de layout é alterado para um como visto anteriormente, um layout do container é estabelecido com o método setLayout de classe Container.

Configuramos o gerenciador de layout do painel de conteúdo como o FlowLayout. Normalmente, o layout é configurado antes de quaisquer componentes GUI serem adicionados a um conteiner.

quaisquer componentes GUI serem adicionados a um conteiner. Figura 2-1:Exemplo de interface construída com FlowLayout

Figura 2-1:Exemplo de interface construída com FlowLayout

Cada tratador de evento actionPerformed do botão executa duas instruções. Por exemplo, o método actionPerformed para o botão left utiliza o método FlowLayout setAlignment para alterar o alinhamento para o FlowLayout para um FlowLayout alinhado à esquerda (FlowLayout .LEFT).

O método de interface LayoutManager layoutContainer para especificar que o painel de conteúdo deve ser reorganizado com base no layout ajustado. De acordo com qual botão foi clicado, o método actionPerformed para cada botão configura o alinhamento do FlowLayout como FlowLayout.LEFT, FlowLayout.CENTER ou FlowLayout.RIGHT.

Tratamento de Eventos

BorderLayout

O gerenciador de layout BorderLayout (o gerenciador de layout-padrão

para o painel de conteúdo) organiza componentes em cinco regiões: 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 vários métodos para um processamento de layout aprimorado).

Até cinco componentes podem ser adicionados diretamente a um BorderLayout — um para cada região. Os componentes colocados nas regiões Norte e Sul estendem-se horizontalmente para os lados do conteiner e tem a mesma altura que o componente mais alto colocado nessas regiões.

As regiões Leste e Oeste expandem-se verticalmente entre as regiões Norte e Sul e tem a mesma largura que o componente mais largo colocado nessas regiões.

O componente colocado na região Centro expande-se para tomar todo o

espaço restante no layout. Se todas as cinco regiões são ocupadas, o espaço do container inteiro é coberto por componentes GUI. Se a região Norte ou a região Sul não for ocupada, os componentes GUI nas regiões Leste, Centro e Oeste expandem-se verticalmente para preencher o espaço restante.

Se a região Leste ou Oeste não for ocupada, o componente GUI na região

Centro expande-se horizontalmente para preencher o espaço restante. Se a região Centro não for ocupada, a área é deixada vazia — os outros componentes GUI não se expandem para preencher o espaço restante.

O aplicativo

BorderLayoutDemo

demonstra

BorderLayout utilizando cinco JButtons.

o

gerenciador

de

layout

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 );

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( b[ 0 ], BorderLayout.NORTH ); c.add( b[ 1 ], BorderLayout.SOUTH ); c.add( b[ 2 ], BorderLayout.EAST ); c.add( b[ 3 ], BorderLayout.WEST ); c.add( b[ 4 ], 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();

}

}

Código 2-2: Exemplo de utilização de BorderLayout.

No construtor de BorderLayout os argumentos especificam o número de

pixels entre componentes que são organizados horizontalmente (espaçamento horizontal) e o número de pixels entre componentes que são organizados

verticalmente (espaçamento vertical), respectivamente.

O construtor-padrão BorderLayout fornece 0 pixel de espaçamento

horizontal e verticalmente. Utilizamos o método setLayout para configurar o layout do painel de conteúdo como layout.

Adicionar componentes a um BorderLayout requer um método add diferente da classe Container, que aceita dois argumentos – o Component para adicionar e a região em que o Component será colocado. Por exemplo, especificamos que o b[0] deve ser colocado na posição NORTE.

Tratamento de Eventos

Tratamento de Eventos Figura 2-2: Exemplo de interface com BorderLayout Os componentes podem ser adicionados em

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 região. Quando o usuário clica em um JButton particular no layout, o método actionPerformed é chamado. O comando for utiliza a seguinte estrutura condicional:

Para ocultar o JButton particular que gerou o evento. O método setVisible (herdado em JButton da classe Component) é chamado com um argumento “false”. Se o JButton atual no array não é o que gerou o evento, o método setVisible é chamado com um argumento true para assegurar que o JButton é exibido na tela.

Utilizamos o método LayoutManager layoutContainer para recalcular o layout do painel de conteúdo. Tente redimensionar a janela de aplicativo para ver como as várias regiões redimensionam-se baseadas na largura e altura da janela.

Tratamento de Eventos

GridLayout

O 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 são adicionados a um GridLayout iniciando a célula na parte superior esquerda da grade e prosseguindo da esquerda para a direita até a linha estar cheia. Então o processo continua da esquerda para a direita na próxima 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 JButton b[]; private String names[] = { "one", "two", "three", "four", "five", "six" }; private boolean toggle = true; private Container c; private 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 );

}

Tratamento de Eventos

toggle = !toggle; c.validate();

}

public static void main( String args[] ) { GridLayoutDemo app = new GridLayoutDemo();

}

}

Código 2-3: Exemplo de utilização de GridLayout.

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

O próximo construtor GridLayout especifica um GridLayout com 3 linhas, 2 colunas e nenhum espaçamento.

GridLayout com 3 linhas, 2 colunas e nenhum espaçamento. Figura 2-3: Exemplo de interface GridLayout Os

Figura 2-3: Exemplo de interface GridLayout

Os objetos JButton nesse exemplo sâo inicialmente organizados utilizando grid1 (associado ao painel de conteúdo com o método setLayout). O primeiro componente é adicionado à primeira coluna da primeira linha. O próximo componente é adicionado à segunda coluna da primeira linha etc. Quando um JButton é pressionado, o método actionPerformed é chamado. Cada chamada para actionPerformed alterna o layout entre grid2 e grid1.

Redesenhos um container cujo layout foi alterado onde o método 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.

Tratamento de Eventos

Exercícios

1. Quais as diferenças entre FlowLayout, BorderLayout e GridLayout?

2. Crie um tabuleiro de Xadrez utilizando os gerenciadores de Layout que você estudou neste capítulo. Para isto veja a imagem abaixo:

de Xadrez utilizando os gerenciadores de Layout que você estudou neste capítulo. Para isto veja a

Tratamento de Eventos

Espaço para anotações

Tratamento de Eventos

3.3.TTratamratamentoento dede EEvventosentos

Tratamento de Eventos

Objetivos

Entender como podem ser tratados os eventos na linguagem java

Conhecer as principais interfaces para tratar eventos

Criar uma aplicação e utilizar o mecanismo de tratamento de eventos

Tratamento de Eventos

Listeners

é

automaticamente enviado para o programa. Informações de eventos GUI são armazenadas em um objeto de uma classe que estende AWTEvent.

Quando

ocorre

uma

interação

com

o

usuário,

um

evento

Os tipos de evento de pacote java.awt.Event são ainda utilizados com os componentes Swing. Também foram adicionados outros tipos de evento que são específicos para vários tipos de componentes Swing. Novos tipos de evento de componente do Swing são definidos no pacote javax.swing.Event.

Para processar um evento de interface gráfica com o usuário, 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 são comuns aos componentes Swing e AWT. Esses tipos são definidos no pacote java.awt.Event. Tipos adicionais de ouvinte de eventos que são específicos de componentes Swing são definidos no pacote javax.swing.Event.

Um objeto ouvinte de eventos "ouve" tipos específicos de eventos gerados no mesmo objeto ou por outros objetos (normalmente componentes GUI) em um programa. Um tratador de eventos é um método que é automaticamente chamado em resposta a um tipo de evento em particular. Cada interface ouvinte de eventos especifica um ou mais métodos de tratamento de evento que devem ser definidos na classe que implementa a interface ouvinte de eventos.

Lembre-se de que as interfaces definem métodos abstract.

Qualquer classe que implementa uma interface deve definir todos os métodos dessa interface; caso contrário, a classe é uma classe abstract e não pode ser utilizada para criar objetos. O uso de ouvintes de eventos em tratamento de eventos é conhecido como modelo de delegação 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 usuário interagiu notifica seus ouvintes registrados chamando o método de tratamento de evento apropriado de cada ouvinte. Por exemplo, quando o usuário pressiona a tecla Enter em um JTextField, o método actionPerformed do ouvinte registrado é chamado.

Tratamento de Eventos

Formas de Tratamento de Eventos

Já conhecendo o funcionamento dos Listener’s (conforme item anterior) deve-se compreender de que forma capturar estes eventos através dos ouvintes (Listeners).

Existem várias interfaces de tratamento de eventos, o objetivo deste capítulo é explicar as formas de como trabalhar com estas interfaces e não as interfaces propriamente ditas. Desta forma, este capítulo é baseado em uma única interface a ActionListener, a fim de facilitar o estudo.

Todas

interfaces

(ActionListener,

MouseListener,

WindowListener,

KeyListener, MouseMotionListener) serão detalhadas no próximo capítulo

O tratamento de eventos pode ser feito através de três formas, conforme seguem as subseções deste capítulo.

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 própria classe onde os ventos são originados ou por outra classe. Os objetos criados a partir desta classe terão a capacidade de responder a eventos. Existem várias interfaces que descrevem tipos de comportamentos, tais como:

ActionListener, MouseListener, WindowListener, KeyListener, MouseMotionListener.

Estas interfaces possuem métodos abstratos que obrigatoriamente devem ser implementados quando utilizadas, estes métodos são os responsáveis pelo tratamento dos eventos.

Veja abaixo um exemplo de implementação de interface pela própria classe onde os eventos são 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();

}

}

Código 3-1: Código fonte de exemplo de tratamento de eventos.

Tratamento de Eventos

O programa acima exemplifica o tratamento de eventos através da utilização de uma interface AcionListener. Ao implementer a interface action listener é necessário utilizar o método actionPerformed() o qual recebe como parâmetro o evento.

Além de implementer a interface ActionListener e programas o método actionPerformed o programa realize uma achamada ao método 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 básicos:

1. Implementar a interface

2. Implementar seus métodos abstratos

3. Definir quais objetos serão escutados, adicionando-os ao listener.

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();

}

}

Código 3-2: Delegando a outro objeto o tratamento de eventos, contrução da GUI.

sair.

Observando

botao.addActionListener(new TratandoEventos()). Este método esta delegando a outra classe (TratandoEventos) o tratamento dos eventos sobre o botão sair.

ao método

O

programa

o

acima

cria

a

GUI

com

uma

a

janela

e

chamada

um

botão

código

nota-se

Abaixo segue o código da classe TratandoEventos:

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);

}

}

Código 3-3: Tratando evento do botão sair.

Neste programa foi implementada a interface ActionListener e implementado o método actionPerformed que esta recebendo como parâmetro os eventos do botão sair do primeiro programa pois foi adicionado ao ouvinte.

Ao receber qualquer açaõ sobre este botão o programa realize um

System.exit(0);

Tratamento de Eventos

Utilizando Classes Anônimas Internas

A terceira e última forma de realizar tratamento de eventos é através de classes anônimas internas (Anonymys Inner Class). Este modo de tratamento é semelhante a delegar a outro objeto (veja o tópico anterior) com a diferença de não possuir uma classe nomeada para tratar o evento, ou seja, o objeto é criado com uma instrução “new” no proprio método addActionListener.

Resumindo, esta é uma forma mais prática de implementer o tratamento de eventos, pois não 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();

}

}

Código 3-4: Tratando eventos com classes anônimas internas.

Prestando atenção no método addActionListener() do objeto botão (JButton) verifica-se que não existe a chamada a uma classe criada anteriormente e sim a um objeto criadao dentro do método através da instrução new.

O trecho de código “new ActionListener() { … }”, possui a mesma funcionalidade que foi detalhada na subseção anterior deste mesmo capítulo com a diferença de não nomear uma nova classe e sim fazer a declaração desta no próprio método de ligação com o ouvinte.

Tratamento de Eventos

Interfaces para Tratamento de Eventos

O objetivo desta subseção é explicar o funcionamento de cada uma das interfaces existentes para tratamento de eventos.

Categoria

Nome da interface

Adaptador

Métodos

Acão

ActionListener

-

public void actionPerformed(ActionEvent e)

Item

ItemListener

-

public void itemStateChanged(ItemEvent e)

Movimento do mouse

MouseMotionListener

MouseMoutionAdapter

public void mouseDragged(MouseEvent e) public void mouseMoved(MouseEvent e)

Botão do mouse

MouseListener

MouseAdapter

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)

Tecla

KeyListener

KeyAdapter

public void keyPressed(KeyEvent e) public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e)

Foco

FocusListener

FocusAdapter

public void focusGained(FocusEvent e)

Ajuste

AjustmentListener

public void focusLost(FocusEvent e) public void adjustmentValueChanged(AdjustmentEvent e)

Componente

ComponentListener

ComponentAdapter

public void componentMoved(ComponentEvent e) public void componentHidden(ComponentEvent e) public void componentResized(ComponentEvent e) public void componentShown(ComponentEvent e)

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)

Texto

TextListener

-

public void textValueChanged(TextEvent e)

Mouse Wheel

MouseWheelListener

-

public void mouseWheelMoved(MouseWheelEvent e)

Estado da Janela

WindowStateListener

-

public void windowStateChanged(WindowEvent e)

Tratamento de Eventos

Eventos de Mouse

Esta seção 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 métodos de interfaces MouseListener e MouseMotionListener são resumidos em:

public void mousePressed( MouseEvent e ) { … }

Chamado quando um botão do mouse é pressionado com o cursor de mouse em um componente.

public void mouseClicked( MouseEvent e ) { … }

Chamado quando um botão do mouse é pressionado e liberado em um componente sem mover o cursor do mouse.

public void mouseReleased( MouseEvent e ) { … }

Chamado

quando

um

botão

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 botão 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 métodos de tratamento de eventos do mouse aceita um objeto MouseEvent como seus argumentos. Um objeto MouseEvent contém as informações sobre o evento de mouse que ocorreu, incluindo as coordenadas x e y da localização onde o evento ocorreu.

Tratamento de Eventos

Os métodos MouseListener e MouseMotionListener são chamados automaticamente quando o mouse interage com um Component se os objetos ouvintes estão registrados em um Component particular. O método mousePressed é chamado quando um botão do mouse é pressionado com o cursor do mouse sobre um componente.

Utilizando métodos e constantes da classe InputEvent (a superclasse de MouseEvent), um programa pode determinar em que botão do mouse o usuário clicou.

O método mouseClicked é chamado sempre que um botão do mouse é

liberado sem mover o mouse depois de uma operação mousePressed.

O método mouseReleased é chamado sempre que um botão do mouse é

liberado.

O método mouseEntered é chamado quando o cursor do mouse entra nos

limites fisicos de um Component.

O método mouseExited é chamado quando o cursor de mouse deixa os

limites fisicos de um Component.

O método mouseDragged é chamado quando o botão 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 método mouseMoved é chamado quando o mouse é movido com o

cursor de mouse sobre um componente (e nenhum botão do mouse pressionado).

O aplicativo MouseTracker demonstra os métodos MouseListener e MouseMotionListener. A classe do aplicativo implementa as duas interfaces de modo a poder ouvir seus próprios eventos de mouse.

Observe que todos os sete métodos 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();

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();

}

}

Código 3-5: Tratando eventos do mouse

Cada evento de mouse resulta na exibição de um String em JLabel statusBar na parte inferior da janela. Definimos JLabel statusBar e o anexamos ao painel de conteúdo.

Até agora, toda as vezes que utilizamos o painel de conteúdo, o método setLayout foi chamado para configurar o gerenciador de layout do painel de conteúdo como um FlowLayout. Isso permitiu ao painel de conteúdo exibir os componentes GUI que anexamos a ele da esquerda para a direta. Se os componentes GUI não se ajustarem em uma linha, o FlowLayout cria linhas adicionais para continuar exibindo os componentes GUI.

Tratamento de Eventos

Realmente, o gerenciador padrão de layout é um BorderLayout que divide a área do painel de conteúdo em cinco regiões - norte, sul, leste, oeste e centro.

em cinco regiões - norte, sul, leste, oeste e centro. Figura 3-1: Exemplo de tratamento de

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

Utilizamos uma nova versão do método Container add para anexar statusBar à região BorderLayout.SOUTH, que se estende ao longo de toda a parte inferior do painel de conteúdo.

Registramos o objeto de janela MouseTracker como o ouvinte para seus próprios eventos de mouse. Os métodos add.MouseListener e addMouseMotionListener são os métodos 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

método

mouseEntered e o método mouseExited são chamados, respectivamente.

Ambos os métodos 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 são obtidas com os métodos MouseEvent getX e getY, respectivamente.

Tratamento de Eventos

Classes Adaptadoras

Muitas das interfaces ouvintes de eventos fornecem múltiplos métodos:

MouseListener e MouseMotionListener são exemplos.

Não é sempre desejável definir cada método 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 término do aplicativo foi tratado com o windowClosing da interface WindowListener, que na realidade especifica sete métodos de tratamento de eventos de janela.

Para muitas das interfaces ouvintes que contém múltiplos métodos, 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 implementação padrão (com o corpo de um método vazio) de cada método na interface. As classes adaptadoras java.awt.Event são mostradas abaixo junto com as interfaces que elas implementam.

Implementa a Interface

Classe Adaptadora de Eventos

ComponentListener

ComponentAdapter

ContainerListener

ContainerAdapter

FocusListener

FocusAdapter

KeyListener

KeyAdapter

MouseListener

MouseAdapter

MouseMotionListener

MouseMotionAdapter

WindowListener

WindowAdapter

Tabela 3-1: Interfaces implementadas por classes adaptadoras.

a

implementação padrão de cada método e então anular o(s) método(s) necessário(s) para tratamento de eventos.

O

programador

pode

estender

a

classe

adaptadora

para

herdar

Tratamento de Eventos

A implementação padrão de cada método na classe adaptadora tem um corpo vazio.

Isso é exatamente o que temos feito em cada exemplo de aplicativo que estende JFrame e define o método 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 usuário pode desenhar figuras com o mouse arrastando o mouse no fundo da janela.

Como

não

pretendemos

utilizar

o

método

mouseMoved,

nosso

MouseMotionListener é definido como uma subclasse de MouseMotionAdapter.

Essa classe já define mouseMoved e mouseDragged, então 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();

}

}

Código 3-6: Código exemplo de classes adaptadoras.

Tratamento de Eventos

As variáveis de instância xValue e yValue armazenam as coordenadas do evento mouseDragged.

Inicialmente, as coordenadas são 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 método que não é precedida por uma referência e por um operador de ponto é na realidade precedida por “this., indicando que o método é chamado para a instância atual da classe em tempo de execução).

Definimos

uma

classe

interna

anônima

que

estende

a

classe

MouseMotionAdapter (que implementa MouseMotionListener).

A classe interna anônima herda uma implementação padrão dos métodos mouseMoved e mouseDragged. Portanto, a classe interna anônima já satisfaz o requisito de que em todos os métodos de uma interface devem ser implementados.

Entretanto, os métodos padrão não fazem nada quando são chamados.

Portanto, anulamos o método mouseDragged para capturar as coordenadas x e y do evento de mouse arrastado e as armazenamos nas variáveis de instância xValue e yValue; então, chamamos repaint para começar a desenhar a próxima oval no fundo (o que é realizado pelo método paint).

Registramos um WindowListener para ouvir os eventos de janela da janela de aplicativo (tais como fechar a janela). Definimos uma classe interna anônima que estende a classe WindowAdapter (que implementa WindowListener).

janela). Definimos uma classe interna anônima que estende a classe WindowAdapter (que implementa WindowListener ). 29

29

Tratamento de Eventos

Figura 3-2: Exemplo de utilização de classes adaptadoras.

A classe interna anônima herda uma implementação padrão dos sete

diferentes métodos de tratamento de eventos de janelas. Portanto, a classe interna anônima já satisfaz o requisito de que uma interface deve ser implementada em todos os métodos.

Entretanto, os métodos padrão não fazem nada quando são chamados. Então, anulamos o método windowClosing para terminar o aplicativo quando o usuário 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 memória, e então a imagem inteira é exibida na janela (ou outro componente GUI).

Isso ajuda a melhorar a qualidade gráfica em uma GUI Swing.

O aplicativo MouseDetails demonstra como determinar o número de cliques de mouse (isto é, a contagem de cliques) e como distinguir entre diferentes botões do mouse.

O ouvinte de eventos nesse programa é um objeto da classe interna

MouseClickHandler que estende MouseAdapter para possamos definir apenas o método 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();

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 botão direito do mouse"; else if ( e.isAltDown() ) s += " com o botão do centro"; else s += " com o botão da esquerda"; setTitle( s ); repaint();

}

}

}

Código 3-7: Exemplo de utilização de classes adaptadoras.

Um usuário de um programa Java pode estar em um sistema com um, dois ou três botões do mouse. Java fornece um mecanismo para distinguir entre os botões do mouse.

um mecanismo para distinguir entre os botões do mouse. Figura 3-3: Exemplo de utilização de classes

Figura 3-3: Exemplo de utilização de classes adaptadoras.

A classe MouseEvent herda vários métodos de classe InputEvent que podem distinguir entre botões do mouse em um mouse de múltiplos botões ou podem simular um mouse de múltiplos botões com um pressionamento de tecla combinado e dique do botão do mouse.

Os métodos InputEvent utilizados para distinguir entre cliques do botão do mouse são:

Método

InputEvent

Descrição

Esse método retoma true quando o usuário clica com o botão direito de um mouse com dois ou três botões. Para simular um clique de botão direito com um mouse de um botão, o usuário pode pressionar a tecla Meta no teclado e clicar no botão

isMetaDown

(

)

Tratamento de Eventos

do mouse.

isAltDown ( )

Esse método retoma true quando o usuário clica no botão do centro do mouse em um mouse com três botões. Para simular um clique com o botão do centro do mouse em um mouse com um ou dois botões, o usuário pode pressionar a tecla Alt no teclado e clicar no botão do mouse.

Tabela 3-2: Quadro de métodos InputEvent

Java pressupõe que cada mouse contém um botão esquerdo do mouse.

Portanto, é simples testar um clique com o botão esquerdo do mouse. Entretanto, usuários com mouse de um ou dois botões devem utilizar uma combinação de pressionamentos de teclas no teclado e clicar no mouse ao mesmo tempo para simular os botões ausentes no mouse.

No caso de um mouse com um ou dois botões, esse programa pressupõe que o botão do centro do mouse é clicado se o usuário mantém pressionada a tecla <Alt> e clica no botão do mouse esquerdo em um mouse de dois botões ou com botão único do mouse em um mouse de um botão.

No caso de um mouse de um botão, esse programa pressupõe que o botão direito do mouse é clicado se o usuário mantém pressionada a tecla Meta e clica no botão do mouse.

O método mouseClicked primeiro captura as coordenadas onde o evento

ocorreu e as armazena em variáveis de instância xPos e yPos da classe MouseDetails. Criamos um String contendo o número de cliques de mouse (como retomado pelo método MouseEvent getClickCount).

A estrutura condicional utiliza os métodos isMetaDown e isAltDown para

determinar qual botão do mouse o usuário clicou e acrescenta um string apropriado para String s em cada caso.

O String resultante exibido na barra de título da janela com o método

setTitle (herdado na classe JFrame da classe Frame). Chamamos repaint para iniciar uma chamada a paint para desenhar um String na localização em que o usuário clicou com o mouse.

Tratamento de Eventos

Tratando Eventos do Teclado

Esta seção apresenta a interface ouvinte de eventos KeyListener para tratar eventos do teclado. Eventos de tecla são gerados quando as teclas no teclado são pressionadas e liberadas. Uma classe que implementa KeyListener deve fornecer definições para os métodos keyPressed keyReleased e keyTyped, cada uma das quais recebe um KeyEvent como seu argumento.

A classe KeyEvent é uma subclasse de InputEvent.

O método keyPressed é chamado em resposta ao pressionamento de

qualquer tecla.

O método keyTyped é chamado em resposta ao pressionamento de

qualquer tecla que não é uma tecla de ação (por exemplo, uma tecla de seta, <Home>, <End>, <Page Up>, <Page Down>, uma tecla de função, <Num Lock>, <Print Screen>, <Scroll Lock>, <Caps Lock> e <Pause>).

O método keyReleased é chamado quando a tecla é liberada depois de

qualquer evento keyPressed ou keyTyped.

Consulte

referência

aos

métodos

KeyListener.

A

classe

KeyDemo

implementa a interface KeyListener, então todos os três métodos são 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 );

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() ? "" : "não " ) + "é uma tecla de ação";

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();

}

}

Código 3-8: Exemplo de tratamento de eventos de teclado.

O construtor registra o aplicativo para tratar seus próprios eventos de

tecla com o método addKeyListener.

O método addKeyListener é definido na classe Component, então cada

subclasse de Component pode notificar KeyListeners de eventos de tecla para esse Component.

Adicionamos a JTextArea textArea (onde a saída do programa é exibida) ao painel de conteúdo. Quando um único Component é adicionado a um BorderLayout, o Component ocupa o inteiro Container por default.

Os métodos keyPressed e keyReleased utilizam o método KeyEvent getKeyCode para obter o código de tecla virtual da chave que foi pressionada. A classe KeyEvent mantém um conjunto de constantes — o código de tecla virtual constante — que representa cada tecla no teclado.

mantém um conjunto de constantes — o código de tecla virtual constante — que representa cada

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 método KeyEvent getKeyText, que retorna um String contendo o nome da tecla que foi pressionada.

virtual,

documentação on-line para a classe KeyEvent (pacote java.awtEvent).

Para

uma

lista

completa

de

constantes

de

tecla

veja

a

O método keyTyped utiliza o método KeyEvent getKeyChar para obter o valor Unicode do caractere digitado.

Todos os três métodos de tratamento de eventos terminam chamando o método setLines2and3 e passando para ele o objeto KeyEvent. Esse método utiliza o método KeyEvent isActionKey para determinar se a tecla no evento era uma tecla de ação.

Além disso, o método InputEvent getModifiers é chamado para determinar se quaisquer teclas modificadoras (como <Shift>, <Alt> e <Ctrl>) foram pressionadas quando o evento de tecla ocorreu.

O resultado desse método é passado para o método KeyEvent getKeyModifiersText, que produz um string contendo os nomes das teclas modificadoras pressionadas.

Nota: Se você precisa testar uma tecla específica 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. Além disso, para determinar se as teclas <Alt>, <Ctrl>, <Meta> e <Shift> são pressionadas individualmente, os métodos InputEvent isAltDown, IsControlDown, isMetaDown e isShiftDown retornam um boolean indicando se a tecla particular foi pressionada durante o evento de tecla.

Tratamento de Eventos

Exercícios

1. Para praticar o tratamento de eventos, crie uma interface gráfica de uma tela de login de acordo com a figura abaixo:

gráfica de uma tela de login de acordo com a figura abaixo: 2. Implemente um listener

2. Implemente um listener para realizar o encerramento do processo java

criado pelo método main da aplicação quando o usuário clicar no ‘X’ da janela.

3. Implemente listeners para os botões que possam realizar ações de

umclique de mouse. Para o botão sair faça também 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 ação quando a tecla ENTER for pressionada sobre o campo.

Tratamento de Eventos

Espaço para anotações

Tratamento de Eventos

4.4.CompComponentesonentes parapara InterfaceInterface GráficaGráfica

Acesso a Banco de Dados

Objetivos

Apresentar os componentes mais utilizados em uma GUI Swing

Entender a relação entre estes componentes

Saber quando utilizar determinado componente

Aprender como utilizar dois ou mais componentes em conjunto

Acesso a Banco de Dados

JFrame

Janelas em uma interface gráfica são áreas retangulares que podem ser exibidas em qualquer área da tela.

A classe JFrame é responsável pela exibição de janelas para o usuário (conforme ilustração abaixo) com os recursos mínimos para sua utilização. Como por exemplo, bordas, barra de títulos, operações de minimizar, maximizar, etc.

barra de títulos, operações de minimizar, maximizar, etc. Figura 4-1: Exemplo de janela JFrame Para que

Figura 4-1: Exemplo de janela JFrame

Para que um JFrame seja exibido, propriedades básicas devem ser definidas, como as suas dimensões, se estará visível ou não entre outras. O programa abaixo mostra a criação de um JFrame definindo seu título e dimensões.

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();

}

}

Código 4-1: Exemplo de utilização de JFrame.

Acesso a Banco de Dados

O programa acima extende a classe JFrame, tendo como objetivo exibir

uma janela na tela do usuário.

O método estático main esta presente para que o programa possa ser

executado. Apenas para relembrar, qualquer programa em uma aplicação Java Swing (que não seja applet) inicia sua execução no método estático main.

No método main encontramos a seguinte: instrução new JanelaPrincipal(). Esta será responsável por criar uma nova instância da classe JanelaPrincipal que é um JFrame.

A partir deste momento o construtor da classe será executado e este irá configurar através de métodos da classe JFrame como a mesma será exibida.

A primeira propriedade que o programa ira definir são as dimensões da

Janela. Isto é feito através de chamada ao método setSize() da classe JFrame, este método pode ser chamado recebendo como parâmetro um objeto java.awt.Dimension ou diretamente com dois inteiros, o primeiro definindo a largura e o segundo a altura. Caso as dimensões não sejam definidas (método setSize()), será criada uma janela com dimensões nulas (zero de largura e zero de altura).

Em seguida o título será definido com a chamada a setTitle();. Este método irá definir como título a String recebida como parâmetro.

Antes de a janela ser exibida, deve ser decidido o que o programa irá realizar quando for efetuada uma operação de fechar a janela. No AWT fazia-se necessário implementar um evento com o código responsável pela operação de fechar a janela. No Swing foi criado um novo método que pode realizar operações padroões de fechamento.

Para utilizar estas funções padrão foi adicionado o método setDefaultCloseOperation(). Este pode receber como parâmetro as constantes da tabela abaixo:

 

DO_NOTHING_ON_CLOS

Não realiza nenhuma operação quando a janela for fechada.

E

 

HIDE_ON_CLOSE

Automáticamente oculta a janela quando esta for fechada através de uma chamada ao método hide().

 

DISPOSE_ON_CLOSE

Automaticamente esconde e descarta a janela. Através de uma chamada ao método dispose().

 

EXIT_ON_CLOSE

Termina a aplicação através do mátodo System.Exit(0).

Acesso a Banco de Dados

Tabela 4-1: Operações padrões de fechamento de janela

No

programa

EXIT_ON_CLOSE.

exemplo,

foi

utilizada

o

método

de

saída

padrão

Neste ponto do programa, as propriedades básicas para exibição de uma janela já estão definidas então deve ser executada uma instrução para exibir a janela na tela através do método show().

Acesso a Banco de Dados

JLabel

Os rótulos fornecem instruções de texto ou informações sobre uma GUI. Os rótulos são definidos com a classe JLabel - uma subclasse de JComponent. Um rótulo exibe uma única linha de texto de leitura.

Uma vez que os rótulos são criados, os programas raramente alteram um conteúdo do rótulo.

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();

}

}

Código 4-2: Exemplo de utilização de JLabel.

Acesso a Banco de Dados

O programa declara três referências JLabel. Os objetos JLabel são instanciados no construtor. A instrução new cria um objeto JLabel com o texto "Label with text".

O texto é exibido no rótulo automaticamente. O método setToolTipText

(herdada na classe JLabel da classe JComponent) especifica uma dica de ferramenta que é exibida automaticamente quando o usuário posiciona o cursor do mouse sobre o rótulo na GUI. Quando executar esse programa, tente posicionar o mouse sobre cada rótulo para ver sua dica de ferramenta.

O método add adiciona label1 ao painel de conteúdo.

Muitos componentes Swing podem exibir imagens especificando um ícone como um argumento para seu construtor ou utilizando um método 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 extenções gif ou jpg (ou jpeg), respectivamente. O arquivo “javalogo.gif” contém a imagem para carregar e armazenar no objeto ImageIcon. Pressupõe-se que esse arquivo esteja no mesmo diretório que o programa. O objeto ImageIcon é atribuido à referência Icon bug. Lembre- se, a classe ImageIcon implementa a interface Icon, portanto um ImageIcon é um Icon.

a interface Icon , portanto um ImageIcon é um Icon . Figura 4-2: Exemplo de JLabel

Figura 4-2: Exemplo de JLabel

A classe JLabel suporta a exibição de Icons. O construtor JLabel é utilizado para criar um rótulo que exibe o texto "Label with text and icon" e o Icon que “logojava” referencia, e é alinhado à esquerda (isto é, o icone e o texto estão o lado esquerdo da área do rótulo na tela).

A interface SwingConstants (pacote javax.swing) define um conjunto de

constantes inteiras comuns (como SwingConstants LEFT) que são utilizadas com muitos componentes Swing. Por default, o texto aparece à direita da imagem quando um rótulo contém tanto texto como imagem.

Os

alinhamentos

horizontal

e

vertical

de

um

rótulo

podem

ser

configurados com os métodos setHorizontalAlignment e setVerticalAligninent,

Acesso a Banco de Dados

respectivamente. A dica de ferramenta é adicionada para label2 e adicionamos label2 ao painel de conteúdo.

A classe JLabel fornece muitos métodos para configurar um rótulo depois que ele foi instanciado. Cria-se um JLabel e invocamos o construtor sem argumentos (padrão). Esse rótulo não tem texto ou Icon.

Utiliza-se o método JLabel setText para configurar o texto exibido no rótulo. Um método correspondente getText recupera o texto atual exibido em um rótulo. Utilizamos um método JLabel setIcon para configurar o Icon exibido no rótulo. Um método correspondente getIcon recupera o Icon atual exibido em um rótulo. Utilizamos os métodos JLabel setHorizontalTextPosition e setVerticalTextPosition para especificar a posição do texto no rótulo.

As instruções precedentes indicam que o texto será centralizado horizontalmente e aparecerá na parte inferior do rótulo. Portanto, o Icon aparecerá acima do texto.Configuramos o texto de dica de ferramenta para o label3 e após adicionamos label3 ao painel de conteúdo.

Acesso a Banco de Dados

JButton

Um botão é um componente em que o usuário clica para acionar uma ação específica. Um programa Java pode utilizar vários tipos de botões, incluindo botões de comando, caixas de seleção, botões de alternação e botões de opção. Consulte a documentação SDK na qual mostra a hierarquia de herança dos botões do Swing que abordaremos neste ítem.

Todos os tipos de botão são subclasses de AbstractButton (pacote javax.swing), o qual define muitos dos recursos que são comuns aos botões do Swing.

Um botão de comando gera um ActionEvent quando o usuário clica no botão com o mouse. Os botões de comando são criados com a classe JButton, que herda da classe AbstractButton. O texto na face de um JButton é chamado de rótulo de botão (caption). Uma GUI pode ter muitos JButtons, mas cada rótulo de botão em geral deve ser único.

O aplicativo abaixo cria dois JButtons e demonstra que JButtons (como JLabels) suportam a exibição de ícones. O tratamento de eventos para os botões é realizado por uma única instância 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 botões" );

Container c = getContentPane(); c.setLayout( new FlowLayout() );

plainButton = new JButton( "Botão 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 );

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();

}

}

Código 4-3: Exemplo de utilização de JButton.

Declaramos duas referências para as instâncias de classe JButton - plainButton e fancyButton (que são instanciadas no construtor). Criamos plainButton com o rótulo de botão “PlainButton” e adicionamos o botão ao painel de conteúdo.

Um JButton pode exibir ícones. Para fornecer ao usuário um nível extra de interatividade visual com a GUI, um JButton também pode ter um ícone rollover, ou seja, um ícone que é exibido quando o mouse é posicionado sobre o botão.

O ícone no botão altera-se quando o mouse se move para dentro e para fora da área do botão na tela. Criamos dois objetos ImageIcon que representam o Icon padrão e o Icon rollover para o JButton criado.

Ambas as instruções pressupõem que os arquivos de imagem são armazenados no mesmo diretório que o programa (que é geralmente o caso para aplicativos que utilizam imagens).

Criamos fancyButton com texto-padrão “Fancy Button” e o Icon bug1. Por default, o texto é exibido à direita do ícone. Utilizamos o método setRolloverIcon (herdado da classe AbstractButton na classe JButton) para especificar a imagem exibida no botão quando o usuário posiciona o mouse sobre o botão. Adicionamos o botão ao painel de conteúdo.

usuário posiciona o mouse sobre o botão. Adicionamos o botão ao painel de conteúdo. Figura 4-3:

Figura 4-3: Exemplo de JButton

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 diálogo de mensagem contendo o rótulo para o botão que foi pressionado pelo usuário.

O método ActionEvent getActionCommand retoma o rótulo do botão que

gerou o evento.

Acesso a Banco de Dados

JTextField e JPasswordField

JTextFields e JPasswordFields (pacote javax.swing) são áreas de uma única linha em que o texto pode ser inserido via teclado pelo usuário ou o texto pode ser simplesmente exibido.

Um JPasswordField mostra que um caractere foi digitado quando o usuário insere os caracteres, mas oculta os caracteres assumindo que eles representam uma senha que deve permanecer conhecida apenas para o usuário.

Quando o usuário digita os dados em um JTextField ou JPasswordField e pressiona a tecla Enter, um evento de ação 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 vários métodos que

são especificos ao processamento de senhas.

O aplicativo de exemplo utiliza as classes JTextField e JPasswordField para

criar e manipular quatro campos. Quando o usuário pressiona Enter no campo atualmente ativo (o componente atualmente ativo "tem o foco"), uma caixa diálogo 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 );

Acesso a Banco de Dados

text3 = new JTextField( "Campo não editável", 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!!!!" );

}

Acesso a Banco de Dados

}

}

Código 4-4: Exemplo de utilização de JTextField e JPasswordField.

São declaradas três referências 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 médio na fonte atual do campo de texto multiplicado por 10.

Adicionamos text1 ao painel de conteúdo. 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 conteúdo.

Definimos JTextField text3 e chamamos o construtor JTextField com dois argumentos - o texto-padrão "Uneditable textfield" para exibir no campo de texto e o número de colunas (20).A largura do campo de texto é determinada pelo número de colunas especificadas.

texto é determinada pelo número de colunas especificadas. Figura 4-4: Exemplo de JTextField e JPasswordField

Figura 4-4: Exemplo de JTextField e JPasswordField

Utilizamos o método setEditable (herdado no JTextField da classe JTextComponent) para indicar que o usuário não pode modificar o texto no campo de texto.

Adicionamos text3 ao painel de conteúdo. 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 conteúdo. 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 instância da classe TextFieldHandler é um ActionListener.

Acesso a Banco de Dados

Definimos uma instância da classe TextFieldHandler e a atribui à referencia handler. Essa instância será utilizada como o objeto ouvinte de eventos para os JTextFields e o JPasswordField nesse exemplo.

Após instruções de registro de evento que especificam o objeto ouvinte de eventos para cada um dos três JTextFields e para o JPasswordField são especificadas. Depois que essas instruções executam, o objeto que handler referencia está ouvindo eventos (isto é, será notificado quando um evento ocorrer) nesses quatro objetos.

Em

cada

caso,

o

método

addActionListener

da

chamado para registrar o evento.

classe

JTextField

é

O método 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 método.

O objeto que handler referencia é um ActionListener porque sua classe

implementa a interface ActionListener. Agora, quando o usuário pressiona Enter em qualquer desses quatro campos, o método actionPerformed na classe TextFieldHandler é chamado para tratar o evento.

O método actionPerformed utiliza seu método ActionEvent do argumento

getSource para determinar o componente GUI com o qual o usuário interagiu e cria um String para exibir em uma caixa de diálogo de mensagem.

O método ActionEvent getActionCommand retorna o texto no JTextField

que gerou o evento.

Se o usuário interagiu com o JPasswordField, Instruções realizam a coerção da referência de Component retornada por e.getSource() para uma referência JPasswordField de modo utilizamos o método JPasswordField getPassword para obter a senha e criar o String a ser exibido.

O método 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 referência do

componente GUI e o texto que o usuário digitou no campo.

Observe que mesmo um JTextField não editável pode gerar um evento. Também observe que o texto real da senha é exibido quando se pressiona Enter no JPasswordField (é claro que normalmente você não faria isso!)

Utilizar uma classe separada para definir um ouvinte de eventos é uma prática de programação comum para separar a interface GUI da implementação de seu tratador de evento.

Acesso a Banco de Dados

JTextArea

A classe JTextArea é destinada a exibir uma área para manipulação de múltiplas 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);

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();

}

}

Código 4-5: Exemplo de utilização de JTextArea.

O programa acima exemplifica a utilização de um JTextArea através da criação de um programa simples que exibe duas caixas de texto (JTextArea) na tela e dois botões (JButton).

Os botões no exemplo permitem duas operações. O primero botão chamado “Copiar Tudo” quando clicado ira copiar o texto digitado na primeira JTextArea para a segunda JTextArea.

O segundo botão 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:

Acesso a Banco de Dados

Acesso a Banco de Dados Figura 4-5: Imagem da tela do programa de exemplo de JTextArea.

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 através da operação new JTextArea() que recebe como parâmetro o texto inicial da caixa de texto, o número de linhas e o número 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).

Além disso, são criados dois botões (conforme já visto no tópico sobre JButton) os quais ao serem clicados realizam diferentes operações. Ambos os botões inserem texto na segunda JTextArea através do método setText.

Para realizar esta operação (definir o texto da segunda JTextArea – objeto txtArea2) o primeiro botão (“Copiar Tudo”) realiza uma chamada ao método getText() da primeira JTextArea (objeto txtArea1) copiando desta forma todo o texto da primeira para a segunda caixa de texto.

Já o segundo botão, utiliza-se do método getSelectedText() para copiar

apenas o texto selecionado da primeira para a segunda caixa de texto.

A tabela abaixo exibe alguns métodos úteis e sua função na classe

JTextArea.

insert(String str, int pos)

Insere o texto na posição expecificada.

replaceRange(String str, int start, int end)

Substitui o texto pelo informado no primeiro parâmetro, da posição inicial até a final.

setTabSize(int size)

Define o tamanho da tabulação (quando pressionado a tecla TAB).

setFont(Font f)

Define a fonte utilizada na caixa de texto.

Tabela 4-2: Métodos principais da classe JTextArea.

Acesso a Banco de Dados

JPanel

Ao desenvolver interfaces mais complexas, cada componente deverá ser colocado em um local exato para que a aplicação fique com uma GUI interessante para o usuário.

Para conseguir localiza-los em posições exatas, torna-se necessária a utilização de “áreas” ou “grupos” de componentes. Estes são chamados de painéis. Os painéis são 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 painéis.

que estes componentes podem ser até mesmo outros painéis. Figura 4-6: Exemplo de utilização de JPanel.

Figura 4-6: Exemplo de utilização de JPanel.

Na imagem acima verificamos a utilização de um JPanel, esta GUI mostra a utilização de dois painéis 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() {

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();

}

}

Código 4-6: Utilização de painéis com JPanel.

No programa acima, a primeira linha do construtor modifica o painel padrão do JFrame para um BorderLayout através do método getContentPane().setLayout(). Este procedimento define o primeiro gerenciador de layout a ser utilizado no primeiro painel.

Logo em seguida é realizada a declaração de um novo painel utilizando-se da classe JPane e também definido um novo gerenciador de layout o GridLayout e após as duas declarações é associado ao segundo painel o GridLayout.

São instanciados quatro objetos, três botões e uma caixa de texto. Os botões são adicionados ao segundo painel através do método add() do painel, já a caixa de texto é associada ao primeiro painel através do mesmo método.

Ao final o segundo painel (contendo os botões) é adicionado na região sul do primeiro painel através do método add(), com isso faz com que a caixa de texto expanda-se por toda a região norte do primeiro painel.

Acesso a Banco de Dados

JComboBox

Uma caixa de combinação (ou combo box, às vezes também chamada de lista drop-down) fornece uma lista de itens entre os quais o usuário pode escolher. As caixas de combinação são 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();

}

}

Código 4-7: Exemplo de utilização de JComboBox.

Acesso a Banco de Dados

Através deste exemplo podemos verificar a utilização 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 contém os nomes dos quatro arquivos de imagem que são armazenados no mesmo diretório que o aplicativo.

Criamos um objeto JComboBox utilizando os Strings no array names como os elementos na lista. Um índice numérico monitora a ordem de itens na JComboBox. O primeiro item é adicionado no índice 0; o próximo 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 são selecionados clicando na JComboBox. Quando clicada, a JComboBox expande em uma lista na qual o usuário pode fazer uma seleção.

Utilizamos o método JComboBox setMaximumRowCount para estabelecer o número máximo de elementos que são exibidos quando o usuário clica na JComboBox. Se houver mais itens na JComboBox que o número máximo de elementos que são exibidos, a JComboBox fornece automaticamente uma barra de rolagem que permite ao usuário visualizar todos os elementos na lista.

permite ao usuário visualizar todos os elementos na lista. Figura 4-7: Exemplo de JComboBox O usuário

Figura 4-7: Exemplo de JComboBox

O usuário 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 usuário 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

botão

do

mouse

pressionado com o cursor de mouse na caixa de rolagem e mova o mouse.

Registramos uma instância de uma classe interna anônima que implementa ItemListener como o ouvinte para JComboBox images. Quando o usuário faz uma seleção de imagens, o método itemStateChanged configura o

Acesso a Banco de Dados

Icon como label. O Icon é selecionado do array icons determinando o número do índice do item selecionado no JComboBox através do método getSelectedlndex.

Acesso a Banco de Dados

Construindo Menus

Em qualquer GUI os menus são fundamentais, pois permitem ao usuário realizar ações sem deixar uma tela confusa com muitos itens ou botões descnecessários.

Os menus se dividem em dois tipos básicos, as barras de menu e os menus popup ou menus de contexto.

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 aplicações, estando localizada abaixo do título da janela.

No Swing uma barra de menu somente podem ser associados a classes que possuam o método setJMenuBar, as classes em que mais comumente utilizamos menus são JFrame e JApplet.

A ilustração abaixo exemplifica o funcionamento dos objetos de menu:

abaixo exemplifica o funcionamento dos objetos de menu: Figura 4-8: Classes utilizadas em uma barra de

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

Conforme verificamos na ilustração acima, temos um primeiro círculo delimitando uma área JMenuBar. Esta área é o espaço 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 é responsável por agrupar itens de um menu como no exemplo acima agrupar as cores do texto ou as funções de arquivo. Um menu não 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 não ficando restrita apenas as barras como veremos mais a frente.

Dentro dos grupos de menu (JMenu) estão colocados os itens (JMenuItem), esta é a parte funcional e “programável” do menu, ou seja estes são os objetos que são a pondo final do menu, fazendo uma analogia a uma árvore, os itens seriam as folhas.

Acesso a Banco de Dados

Os itens de menu podem derivar de dois outros tipos também, JCheckBoxMenuItem e JRadioButtonMenuItem, estes responsáveis por exibirem um item radio ou check no menu conforme veremos a frente.

Segue o código fonte exemplo que foi utilizado para construção da tela acima:

package com.targettrust.java.capitulo04;

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class ExemploMenu extends JFrame {

JMenuBar barra = new JMenuBar(); JLabel texto = new JLabel();

public ExemploMenu() { FlowLayout layout = new FlowLayout(); layout.setAlignment(FlowLayout.CENTER); getContentPane().setLayout(layout);

setTitle("Exemplo de JMenuBar, JMenu e JMenuItem"); setSize( 400, 300 ); setDefaultCloseOperation(EXIT_ON_CLOSE);

JMenu arquivo = new JMenu("Arquivo"); arquivo.setMnemonic('A');

JMenuItem sair = new JMenuItem("Sair"); arquivo.add(sair);

barra.add(arquivo);

JMenu cor = new JMenu("Cor do Texto"); cor.setMnemonic('C');

JMenuItem azul = new JMenuItem("Azul"); JMenuItem vermelho = new JMenuItem("Vermelho"); JMenuItem verde = new JMenuItem("Verde");

cor.add(azul);

cor.add(vermelho);

cor.add(verde);

barra.add(cor);

setJMenuBar(barra);

texto.setText("Curso Java"); texto.setSize(100, 14); texto.setForeground(Color.BLUE); getContentPane().add(texto);

// Continua na próxima página azul.addActionListener(

Acesso a Banco de Dados

new ActionListener() { public void actionPerformed(ActionEvent e) { texto.setForeground(Color.BLUE);

}

);

}

vermelho.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { texto.setForeground(Color.RED);

}

);

}

verde.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { texto.setForeground(Color.GREEN);

}

);

}

sair.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) {

System.exit(0);

}

);

}

setVisible(true);

}

public static void main(String args[]) { ExemploMenu app = new ExemploMenu();

}

}

Código: 4-8: Construindo uma barra de menus.

No programa acima, a primeira ação realizada é a criação de uma instância de JMenuBar chamada barra. Este objeto será o agregador de todos os itens filhos do menu.

No construtor são criados novos objetos chamados arquivo e cor. Estes serão os agrupadores (os dois grupos de menus). Ou seja, serão os itens que ficaram visíveis na barra logo que o programa for executado. Estes recebem como parâmetro na sua construção o nome a ser exibido ou o Label. Após criar estes objetos, é realizada uma chamada ao método setMnemonic() da classe JMenu, o qual definirá qual será a letra da palavra que servirá como atalho para este menu (exemplo Arquivo, a vogal “A” é a letra ou tecla de atalho para este menu).

Na seqüência são criados objetos JMenuItem que serão os itens do menu efetivamente, estes recebem como parâmetro em sua contrução o nome a ser exibido.

Acesso a Banco de Dados

Após os itens do menu criados, o programa realiza a associação destes itens a seus grupos, através do método add() da classe JMenuItem(), como exemplo cor.add(azul), onde cor é o JMenu e azul é o JMenuItem, em outras palavras é feita a ligação do item como menu (grupo).

Da mesma forma como é feita esta relação, também deve-se associar os JMenu’s a barra de menus (JMenuBar) e isto é feito através do método add() da classe JMenuBar, por exemplo barra.add(cor), onde é efeivamente feita a ligação do JMenu (cor) a JMenuBar (barra).

Neste ponto os menus estão configurados e relacionados, então são adicionados ao JFrame através do método setJMenuBar(barra) e finalmente executado o método show() do JFrame para que seja exibido o programa em tela.

Resumindo a montagem do menu. Os menus são associados em cascata, ou seja, associa-se o item ao grupo que pode estar relacionado a outro grupo com outros itens e assim sucesivamente até chegar à barra de menus.

Agora o programa começa a associar funcionalidade aos botões e esta é feita através de implementação de código nos métodos addActionListner() da classe JMenuItem. Os JMenuItem’s do grupo cor (“Cor do Texto”) possuem todos o mesmo código fonte, modificando a cor do JLabel da tela para a cor clicada através dp método setForeground da classe JLabel. O único JMenuItem com implementação diferente é o “Sair” que efetua uma chamada a System.exit() encerrando a aplicação.

Acesso a Banco de Dados

Utilizando JRadioButtonMenuItem

Conforme

citado

acima,

podemos

também

utilizar

itens

radio

na

construção de menus para gerar uma situação como a da figura abaixo:

de menus para gerar uma situação como a da figura abaixo: Figura 4-9: Exemplo de utilização

Figura 4-9: Exemplo de utilização de JRadioButtonMenuItem.

Segue abaixo o código exemplo:

package com.targettrust.java.capitulo04;

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class ExemploMenuRadioButton extends JFrame {

JMenuBar barra = new JMenuBar();

public ExemploMenuRadioButton() { FlowLayout layout = new FlowLayout(); layout.setAlignment(FlowLayout.CENTER); getContentPane().setLayout(layout);

setTitle("Exemplo de JMenuBar, JMenu e JMenuItem");

JMenu cores = new JMenu("Cores");

ButtonGroup grupo = new ButtonGroup(); JRadioButtonMenuItem azul = new JRadioButtonMenuItem("Azul"); JRadioButtonMenuItem verde = new JRadioButtonMenuItem("Verde"); JRadioButtonMenuItem vermelho = new JRadioButtonMenuItem("Vermelho");

grupo.add(azul);

Acesso a Banco de Dados

grupo.add(verde);

grupo.add(vermelho);

cores.add(azul);

cores.add(verde);

cores.add(vermelho);

barra.add(cores);

setJMenuBar(barra);

setSize( 400, 300 ); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true);

}

public static void main(String args[]) { ExemploMenuRadioButton app = new ExemploMenuRadioButton();

}

}

Código 4-9: Criando menus com JRadioButtonMenuItem.

O programa exemplo acima é semelhante ao programa exibido anteriormente, desta forma neste tópico será dado enfoque as áreas diferentes deste código.

A primeira ação para construção de um JRadioButtonMenuItem é a criação

de um grupo de botões. Este grupo tem por função dizer quais são os itens que estarão inclusos no radio para fins de restringir que exista apenas um item selecionado do mesmo grupo.

A criação deste grupo é feita através do objeto grupo, instanciado a partir

da classe ButtonGroup.

Na seqüência são criados os itens de JRadioButtonMenuItem efetivamente, declarando os objetos azul, verde e vermelho. Após a declaração destes itens, os mesmos são associados ao grupo de botões e após associados ao JMenu.

Este

código fará com que sejam exibidos três itens radio no menu

permitindo a seleção de apenas um destes.

Acesso a Banco de Dados

JCheckBoxMenuItem

Conforme

citado

acima,

podemos

também

utilizar

itens

check

na

construção de menus para gerar uma situação como a da figura abaixo:

de menus para gerar uma situação como a da figura abaixo: Figura 4-10: Exemplo de utilização

Figura 4-10: Exemplo de utilização de JCheckBoxMenuitem.

Segue abaixo o código de exemplo:

package com.targettrust.java.capitulo04;

import java.awt.*; import javax.swing.*;

public class ExemploMenuCheckBox extends JFrame {

JMenuBar barra = new JMenuBar();

public ExemploMenuCheckBox() {

FlowLayout layout = new FlowLayout(); layout.setAlignment(FlowLayout.CENTER); getContentPane().setLayout(layout);

setTitle("Exemplo de JMenuBar, JMenu e JMenuItem");

JMenu estilo = new JMenu("Estilo da Fonte");

JCheckBoxMenuItem negrito = new JCheckBoxMenuItem("Negrito"); JCheckBoxMenuItem italico = new JCheckBoxMenuItem("Italico"); JCheckBoxMenuItem sublinhado = new JCheckBoxMenuItem("Sublinhado");

estilo.add(negrito);

estilo.add(italico);

Acesso a Banco de Dados

estilo.add(sublinhado);

barra.add(estilo); setSize(400, 300); setDefaultCloseOperation(EXIT_ON_CLOSE); setJMenuBar(barra);

setVisible(true);

}

public static void main(String args[]) { ExemploMenuCheckBox app = new ExemploMenuCheckBox();

}

}

Código 4-10: Criando menus com JCheckBoxMenuItem.

O programa exemplo acima funciona exatamente do mesmo modo que os programas explicados nos tópicos anteriores tendo como única diferença a substituição dos itens JMenuItem por JCheckBoxMenuItem.

Acesso a Banco de Dados

JPopupMenu

A classe JPopupMenu é responsável pela exibição de pequenos menus (menus de contexto) os quais são muito utilizados nos atuais programas de computador. No Swing são exibidos ao receberem o gatilho pop-up que geralmente é disparado com o clicar do botão direito do mouse.

Para ilustrar JPopupMenu:

a

explicação

acima

segue a seguinte

imagem de

um

a explicação acima segue a seguinte imagem de um Figura 4-11: Exemplo de utilização de JPopupMenu.

Figura 4-11: Exemplo de utilização de JPopupMenu.

No programa abaixo é exibido o código fonte que originou a imagem:

package com.targettrust.java.capitulo04;

import java.awt.*; import java.awt.event.*; import javax.swing.*;