slides15 - Blog Ramon RDM

Propaganda
COMPONENTES GUI
(capítulo 11 Deitel)
Roberto Willrich
INE-CTC-UFSC
Carla Merkle Westphall
INE-CTC-UFSC
E-Mail: [email protected]
URL: http://moodle.inf.ufsc.br
INE5605-Turma 0238A
1
2
Objetivos
Neste capítulo aprenderemos:
 Construir interfaces gráficas e tratar
eventos gerados pelas interações do
usuário.
 Entender os pacotes contendo
componentes GUI, classes de tratamento
de eventos e interfaces.
 Criar e manipular botões, labels, listas,
campos de texto e painéis.
 Tratar eventos de manipulação do mouse
e de teclado.
 Usar o layout managers para organizar os
componentes GUI
 2005 Pearson Education, Inc. All rights reserved.
3
Introdução
• Interfaces gráficas (GUI)
– Oferecem um mecanismo amigável de interação com
as aplicações
– Normalmente contém barra de título, barra de menu
contendo menus, botões e campos de texto
– Construídos a partir de componentes GUI
 2005 Pearson Education, Inc. All rights reserved.
4
Botão
Menus
Barra de título
Barra de menus
Campo de texto
Barras de
rolagem
Internet Explorer com componentes GUI.
 2005 Pearson Education, Inc. All rights reserved.
5
Entrada/Saída Simples Baseada em GUI
comJOptionPane
• Caixas de diálogo
– Usada pelas aplicações para interagir com o usuário
– Oferecida pela classe Java JOptionPane
• Contém diálogos de entrada e de mensagem
 2005 Pearson Education, Inc. All rights reserved.
1
2
// Arquivo: Adicao.java
// Programa Adicao que usa JOptionPane para entrada e saída.
3
import javax.swing.JOptionPane; // programa usa JOptionPane
6
Resumo
4
5
public class Adicao
6
{
7
8
public static void main( String args[] )
{
Mostra caixa de entrada para
receber o primeiro inteiro Adicao.java
(1 de 2)
9
// Obtém entradas do usuário a partir do diálogos de entrada JOptionPane
10
11
12
String primeiroNumero =
Mostra caixa de entrada para
JOptionPane.showInputDialog( "Digite primeiro numero" );
receber o segundo inteiro
String segundoNumero =
13
14
15
16
17
18
19
20
21
22
23
JOptionPane.showInputDialog( "Digite segundo numero" );
// converte entrada em String para um valor int para usar no cálculo
int numero1 = Integer.parseInt( primeiroNumero );
int numero2 = Integer.parseInt( segundoNumero );
int soma = numero1 + numero2; // adiciona os números Mostra
caixa de mensagem para
apresentar a soma ao usuário
// Apresenta o resultado em uma janela de diálogo JOptionPane x
JOptionPane.showMessageDialog( null, "A soma é " + soma,
"Soma de dois inteiros", JOptionPane.PLAIN_MESSAGE );
24
} // fim do método main
25 } // fim da classe Adição
 2005 Pearson Education, Inc. All rights reserved.
Caixa de Dialogo: Caixa de
Mensagem
7
• Classe JOptionPane
– Método JOptionPane.showMessageDialog
• Argumentos
– Primeiro usado para posicionamento na tela
• Null para colocar a caixa no centro da tela do frame default
– Segundo é a String a apresentar
– Terceiro é o titulo da janela
– Quarto é o tipo de mensagem
// Imprime linhas na caixa de dialogo
import javax.swing.JOptionPane; // importa classe JOptionPane
public class Dialog2 {
public static void main( String args[] ) {
// apresenta um dialogo com a mensagem
JOptionPane.showMessageDialog( null, "Bem vindo\na\nJava" ,
"Titulo", JOptionPane.INFORMATION_MESSAGE);
}
}
 2005 Pearson Education, Inc. All rights reserved.
8
Caixas de diálogos apresentadas pelas linhas 10–11
Prompt para o usuário
Campo de texto em que
o usuário digita um
valor
Quando o usuário clica em
OK,
showInputDialog
retorna para o programa
o 2 digitado pelo usuário
como uma String. O
programa deve converter
o String para um int
Adicao.java
(2 de 2)
Caixa de entrada apresentada pelas linhas 12–13
Barra de titulo
Caixa de mensagem apresentada pelas linhas 22–23
Quando o usuário clica em
OK, a caixa de
mensagem desaparece
 2005 Pearson Education, Inc. All rights reserved.
9
Tipo de mensagens
Icone Descrição
ERROR_MESSAGE
Um diálogo que indica um erro ao usuario.
INFORMATION_MESSAGE
Um diálogo com uma mensagem informacional
para o usuário.
WARNING_MESSAGE
Um diálogo de advertência indicando um
problema potencial.
QUESTION_MESSAGE
Um diálogo que questiona o usuário. Ela
normalmente requer uma resposta, tal como
clicar um botão Sim ou um Não.
PLAIN_MESSAGE
sem
icone
Um diálogo que contém uma mensagem, mas
sem icone.
Constantes static JOptionPane para caixas de dialogo.
 2005 Pearson Education, Inc. All rights reserved.
10
Visão Geral dos Componentes Swing
• Componentes GUI Swing
– Declarados no pacote javax.swing
– Muitos deles são componentes Java puros
– Parte das Java Foundation Classes (JFC)
• É um framework gráfico para construir interfaces gráficas
(GUIs) portáveis baseadas em Java. JFC consiste do AWT
(Abstract Window Toolkit), Swing e Java 2D. Juntos, eles
oferecem uma interface gráfica para programas em Java que
rodam em plataformas populares como Microsoft Windows,
Linux, e Mac OSX.
 2005 Pearson Education, Inc. All rights reserved.
11
Componente
Descrição
JLabel
Apresenta ícones e textos não editáveis.
JTextField
Permite ao usuário digitar dados a partir do teclado. Ela pode também
ser usada para apresentar texto editável ou não editável.
JButton
Ativa um evento quando clicado com o mouse.
JCheckBox
Componente GUI que pode estar no estado selecionado ou não
selecionado.
JComboBox
Fornece uma lista escamoteável de itens a partir da qual o usuário pode
fazer uma seleção clicando um item ou possivelmente digitando na
caixa.
JList
Fornece uma lista de itens no qual o usuário pode fazer uma seleção
clicando em qualquer item na lista. Vários elementos podem ser
selecionados.
JPanel
Fonece uma área na qual componentes podem ser colocados e
organizados. Podem também ser usados como uma área de desenho
para grafismos.
Alguns componentes gráficos básicos.
 2005 Pearson Education, Inc. All rights reserved.
12
Swing vs. AWT
• Abstract Window Toolkit (AWT)
– Precursor do Swing
– Declarado no pacote java.awt
– Não oferece uma apresentação multi-plataforma
consistente
 2005 Pearson Education, Inc. All rights reserved.
13
Tópico de portabilidade
Componentes Swing são implementados em Java,
assim elas são mais portáveis e flexíveis que os
componentes GUI Java do pacote java.awt, que
foram baseadas nos componentes GUI da
plataforma de base. Por esta razão, componentes
Swing são geralmente preferidos.
 2005 Pearson Education, Inc. All rights reserved.
14
Componentes GUI Leves vs. Pesados
• Componentes leves
– Não depende diretamente de componentes GUI suportados
pela plataforma de base
• Componentes pesados
– Dependentes diretamente da plataforma local (S.O.)
– Componentes AWT
– Alguns componentes Swing
 2005 Pearson Education, Inc. All rights reserved.
15
Observação
A forma de apresentação da interface definida
por componentes GUI pesados a partir do pacote
java.awt varia de acordo com a plataforma.
Como componentes pesados são ligados a GUI
da plataforma local, a forma de apresentação
varia de plataforma para plataforma.
 2005 Pearson Education, Inc. All rights reserved.
16
Superclasses dos componentes GUI
leves do Swing
• Classe Component (pacote java.awt)
– Subclasse de Object
– Declara muitos comportamentos e atributos comuns aos componentes
GUI
• Classe Container (pacote java.awt)
– Subclasse de Component
– Organiza Components
• Classe JComponent (pacote javax.swing)
– Subclasse de Container
– Superclasse de todos os componentes Swing leves
 2005 Pearson Education, Inc. All rights reserved.
 Apresentação de Textos e Imagens em
uma Janela
17
• Classe JFrame
– Muitas janelas são instancias ou subclasse desta classe
– Oferece uma barra de título
– Oferece botões para minimizar, maximizar ou fechar a
aplicação
 2005 Pearson Education, Inc. All rights reserved.
18
Nomeando componentes GUI
• Label
– Instruções ou informações textuais indicando o propósito
de cada componentes
– Criado com a classe JLabel
 2005 Pearson Education, Inc. All rights reserved.
19
Especificando o Layout
• Containers de layout (Layout Containers)
– Determina onde os componentes são colocados no
container
– Feito em Java com gerenciadores de layout (layout
managers)
• Uma destas classes é FlowLayout
– Configurado com o método setLayout da classe
JFrame
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: LabelFrame.java
2
3
4
// Demonstrando a classe Jlabel.
import java.awt.FlowLayout; // especifica como componentes são arranjados
import javax.swing.JFrame; // prove as caracteristicas basicas da janela
5
6
7
8
9
import
import
import
import
20
Resumo
javax.swing.JLabel; // apresenta textos e imagens
javax.swing.SwingConstants; // Constantes comuns usadas com Swing
javax.swing.Icon; // interface usada para processar imagens
javax.swing.ImageIcon; // carrega imagens
LabelFrame.java
(1 de 2)
10 public class LabelFrame extends JFrame
11 {
12
private JLabel label1; // JLabel com apenas um texto
13
14
15
16
17
private JLabel label2; // JLabel construido com texto e icone
private JLabel label3; // JLabel com texto adicionado com icone
18
{
19
20
// construtor LabelFrame adiciona JLabels a JFrame
public LabelFrame()
super( "Testando JLabel" ); // construtor de JFrame passando o título
setLayout( new FlowLayout() ); // define o frame layout
21
22
// construtor JLabel com um argumento string
23
24
label1 = new JLabel( "Label com texto" );
label1.setToolTipText( "Este é o label1" );
25
26
add( label1 ); // adiciona label1 ao JFrame
 2005 Pearson Education, Inc. All rights reserved.
27
28
29
30
// construtor JLabel com argumentos string, Icon e alinhamento
21
Resumo
Icon bug = new ImageIcon( getClass().getResource( "bug1.gif" ) );
label2 = new JLabel( "Label com texto e icone", bug,
SwingConstants.LEFT );
31
32
33
34
label2.setToolTipText( "Este é label2" );
add( label2 ); // adiciona label2 ao JFrame
35
36
label3.setText( "Label com icone e texto no botão " );
label3.setIcon( bug ); // adiciona icone ao JLabel
37
38
39
label3.setHorizontalTextPosition( SwingConstants.CENTER );
label3.setVerticalTextPosition( SwingConstants.BOTTOM );
label3.setToolTipText( "Este é label3" );
LabelFrame.java
label3 = new JLabel(); // construtor JLabel sem argumentos
(2 de 2)
40
add( label3 ); // adiciona label3 ao JFrame
41
} // fim do construtor LabelFrame
42 } // fim da classe LabelFrame
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: TesteLabel.java
2
// Testando LabelFrame.
3
import javax.swing.JFrame;
22
Resumo
4
5
public class TesteLabel
6
{
TesteLabel.java
7
public static void main( String args[] )
8
{
9
LabelFrame labelFrame = new LabelFrame(); // cria LabelFrame
10
labelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
labelFrame.setSize( 275, 180 ); // define tamanho do frame
12
labelFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe TesteLabel
 2005 Pearson Education, Inc. All rights reserved.
23
Criando e anexando label1
• Construtor tendo como argumento o texto
• Método setToolTipText da classe
JComponent
– Especifica o texto de ajuda (tool tip)
• Método add da classe Container
– Adiciona um componente em um container
label1 = new JLabel( "Label com texto" );
label1.setToolTipText( "Este é o label1" );
add( label1 ); // adiciona label1 ao JFrame
 2005 Pearson Education, Inc. All rights reserved.
24
Observação
Use tool tips para adicionar um texto descritivo
nos seus componentes gráficos. Este texto ajuda
o usuário na determinação dos objetivos dos
componentes da interface.
 2005 Pearson Education, Inc. All rights reserved.
25
Erro comum de programação
Se você esquece de adicionar um componente
no container, este componente não será
apresentado quando o container aparecer na
tela.
 2005 Pearson Education, Inc. All rights reserved.
26
Criando e Anexando label2
• Texto, ícone e posicionamento são passados no
construtor de JLabel
– Interface Icon:
• Pequena imagem de tamanho fixo
• IconImage é uma implementação da interface Icon que
apresenta ícones a partir de Images
– Images são criadas a partir de URL, nome do arquivo ou
array de bytes pré-carregados com MediaTracker
– No exemplo é passado o URL (getClass().getRessource())
Icon bug = new ImageIcon( getClass().getResource(
"bug1.gif" ) );
label2 = new JLabel( "Label com texto e icone", bug,
SwingConstants.LEFT );
label2.setToolTipText( "Este é label2" );
add( label2 ); // adiciona label2 ao JFrame
 2005 Pearson Education, Inc. All rights reserved.
27
Criando e Anexando label3
• Construtor default e uso de métodos JLabel
– getText e setText
• Para definir e recuperar o texto de um label
– getIcon e setIcon
• Para definir e recuperar o ícone apresentado no label
– getHorizontalTextPosition e
setHorizontalTextPosition
• Para definir e recuperar a posição horizontal do texto apresentado
no label
label3 = new JLabel(); // construtor JLabel sem argumentos
label3.setText( "Label com icone e texto no botão " );
label3.setIcon( bug ); // adiciona icone ao JLabel
label3.setHorizontalTextPosition( SwingConstants.CENTER );
label3.setVerticalTextPosition( SwingConstants.BOTTOM );
label3.setToolTipText( "Este é label3" );
add( label3 ); // adiciona label3 ao JFrame
 2005 Pearson Education, Inc. All rights reserved.
28
Criando e Anexando label2
• Interface SwingConstants
– Declara um conjunto de constantes inteiras comuns tal
como aquela usada para definir o alinhamento dos
componentes
– Pode ser usada com métodos
setHorizontalAlignment e
setVerticalAlignment
 2005 Pearson Education, Inc. All rights reserved.
29
Constante
Descrição
Constantes de posicionamento horizontal
SwingConstants.LEFT
SwingConstants.CENTER
SwingConstants.RIGHT
Coloca texto na esquerda.
Coloca texto no centro.
Coloca texto na direita.
Constantes de posicionamento vertical
SwingConstants.TOP
SwingConstants.CENTER
SwingConstants.BOTTOM
Coloca texto no topo.
Coloca texto no centro.
Coloca texto em baixo.
Alguns componentes GUI básicos
 2005 Pearson Education, Inc. All rights reserved.
30
Criando e Apresentando a janela
LabelFrame
• Outros métodos JFrame
– setDefaultCloseOperation
• Indica como a aplicação reage quando o usuário clica no
botão fechar
– setSize
• Especifica a altura e largura da janela
– setVisible
• Determina se a janela é apresentada (true) ou não (false)
public static void main( String args[] )
{
LabelFrame labelFrame = new LabelFrame(); // cria LabelFrame
labelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
labelFrame.setSize( 275, 180 ); // define tamanho do frame
labelFrame.setVisible( true ); // apresenta frame
} // fim do main
 2005 Pearson Education, Inc. All rights reserved.
 Campos de texto e uma introdução a
tratamento de eventos com classes
aninhadas
31
• GUIs são orientadas a eventos
– Uma interação do usuário cria um evento
• Eventos comuns são clicar um botão, digitar em um campo
de texto, selecionar um item em um menu, fechar uma janela,
mover o mouse, etc.
– O evento causa uma chamada a um método chamado de
tratador de eventos (event handler)
 2005 Pearson Education, Inc. All rights reserved.
Campos de texto e uma introdução a
tratamento de eventos com classes
aninhadas
32
• Classe JTextComponent
– Superclasse de JTextField
• Superclasse de JPasswordField
– Adiciona o caractere echo para esconder a entrada de
texto no componente
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: FrameCampoDeTexto.java
2
3
// Demonstrando a classe JTextField.
import java.awt.FlowLayout;
4
import java.awt.event.ActionListener;
5
6
7
8
9
import
import
import
import
import
33
Resumo
java.awt.event.ActionEvent;
javax.swing.JFrame;
javax.swing.JTextField;
javax.swing.JPasswordField;
javax.swing.JOptionPane;
FrameCampoDe
Texto.java
(1 de 3)
10
11 public class FrameCampoDeTexto extends JFrame
12 {
13
private JTextField campoDeTexto1; // campo de texto com tamanho definido
14
private JTextField campoDeTexto2; // campo de texto construido com texto
15
16
private JTextField campoDeTexto3; // campo de texto com texto e tamanho
private JPasswordField campoPassword; // campo password com texto
17
18
19
20
21
22
// Construtor FrameCampoDeTexto adiciona JTextFields a JFrame
public FrameCampoDeTexto ()
{
super( "Testando JTextField e JPasswordField" ); // título do JFrame
setLayout( new FlowLayout() ); // atribui frame layout
23
24
25
26
Cria um novo JTextField
// Constroi textfield com 10 colunas
campoDeTexto1 = new JTextField( 10 );
add( campoDeTexto1 ); // adiciona campoDeTexto1 ao JFrame
27
 2005 Pearson Education, Inc. All rights reserved.
28
29
30
31
32
33
// Constroi campo de texto com texto default
campoDeTexto2 = new JTextField( "Digite um texto aqui " );
Resumo
34
add( campoDeTexto2 ); // adiciona campoDeTexto2 ao JFrame
Cria um novo JTextField
// constroi campo de texto com texto default e 21 colunas
campoDeTexto3 = new JTextField( "Texto de campo não editavel", 21 );
FrameCampoDe
Texto.java
novo JTextField não
(2 de 3)
editável
34
35
36
37
campoDeTexto3.setEditable( false ); // desabilita edição
add( campoDeTexto3 ); // adiciona campoDeTexto ao JFrame
Cria um
38
39
40
campoPassword = new JPasswordField( "Texto Escondido" );
add( campoPassword ); // adiciona campoPassword ao JFrame
41
42
// registra tratador de evento
TratadorCampoDeTexto tratador = new TratadorCampoDeTexto();
43
44
campoDeTexto1.addActionListener( tratador );
campoDeTexto2.addActionListener( tratador );
45
46
47
48
49
50
51
52
53
campoDeTexto3.addActionListener( tratador );
campoPassword.addActionListener( tratador );
} // fim do construtor FrameCampoDeTexto
54
55
56
// constroi campoPassword com texto default
Cria um novo JPasswordField
Criar tratador de evento
Registra tratador de evento
// classe interna privada para tratamento de eventos
private class TratadorCampoDeTexto implements ActionListener
Cria uma classe tratador de evento
{
pela implementação da interface
// processa eventos no campo de texto
ActionListener
public void actionPerformed( ActionEvent event )
{
String string = ""; // declara string a apresentar
Declara método
actionPerformed
 2005 Pearson Education, Inc. All rights reserved.
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// usuario clicou Enter no JTextField campoDeTexto1
Outline
if ( event.getSource() == campoDeTexto1 )
35
Testa se a fonte do evento é o
primeiro campo de texto
string = String.format( "campoDeTexto1: %s",
event.getActionCommand() );
Obtém texto do campo de texto
// usuario clicou Enter no JTextField campoDeTexto2
FrameCampoDe
else if ( event.getSource() == campoDeTexto2 )
Testa se a fonte do eventoTexto.java
éo
string = String.format( " campoDeTexto2: %s",
segundo campo de texto
event.getActionCommand() );
(3 de 3)
Obtém texto do campo de texto
// usuario clicou Enter no JTextField campoDeTexto3
else if ( event.getSource() == campoDeTexto3 )
Testa
string = String.format( " campoDeTexto3: %s",
event.getActionCommand() );
se a fonte do evento é o
terceiro campo de texto
Obtém texto do campo de texto
// usuario clicou Enter no JTextField campoPassword
else if ( event.getSource() == campoPassword )
Testa se a fonte do evento é o
string = String.format( "campoPassword: %s",
campo password
new String(campoPassword.getPassword() ) );
// apresenta conteudo do JtextField
JOptionPane.showMessageDialog( null, string );
} // fim do método actionPerformed
Obtém password do campo
password
80
} // fim da classe interna privada TratadorCampoDeTexto
81 } // fim da classe FrameCampoDeTexto
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: TesteCampoDeTexto.java
2
// Testando FrameCampoDeTexto.
3
import javax.swing.JFrame;
36
Outline
4
5
public class TesteCampoDeTexto
6
{
7
public static void main( String args[] )
8
{
TesteCampoDe
Texto.java
9
FrameCampoDeTexto frameCampoDeTexto = new FrameCampoDeTexto ();
10
frameCampoDeTexto.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
frameCampoDeTexto.setSize( 325, 120 ); // define tamanho do frame
12
frameCampoDeTexto.setVisible( true ); // apresenta frame
13
(1 de 2)
} // fim do main
14 } // fim da classe TesteCampoDeTexto
 2005 Pearson Education, Inc. All rights reserved.
37
Resumo
TesteCampoDe
Texto.java
(2 de 2)
 2005 Pearson Education, Inc. All rights reserved.
Passos necessários para configurar um
tratador de eventos para um componente
gráfico
38
• Vários passos são necessários para uma aplicação
responder eventos
– Criar uma classe para um tratador de evento
• Implementa uma interface event-listener apropriada
– Registrar o tratador de eventos
TratadorCampoDeTexto tratador = new TratadorCampoDeTexto();
campoDeTexto1.addActionListener( tratador );
//...
private class TratadorCampoDeTexto implements ActionListener
{
// processa eventos no campo de texto
public void actionPerformed( ActionEvent event )
{
//...
}
}
 2005 Pearson Education, Inc. All rights reserved.
39
Usando uma classe aninhada para
implementar um tratador de eventos
• Classe de alto-nível (classe externa)
– Não declarada dentro de outra classe
• Classes aninhada
– Declarada dentro de outra classe
– Classes aninhadas não-static são chamadas classes
internas
• Com freqüência usadas para tratamento de eventos
public class FrameCampoDeTexto extends JFrame
{
//...
private class TratadorCampoDeTexto implements ActionListener
{
//...
}
}
 2005 Pearson Education, Inc. All rights reserved.
40
Observação
Um classe interna pode acessar diretamente os
atributos e métodos da classe externa, mesmo
se eles são private.
 2005 Pearson Education, Inc. All rights reserved.
41
Usando uma classe aninhada para
implementar um tratador de eventos
•JTextFields e JPasswordFields
– Digitando “enter” dentro destes campos causa um
ActionEvent
• Processado pelos objetos que implementam a interface
ActionListener
 2005 Pearson Education, Inc. All rights reserved.
42
Registrando o tratador de eventos para
cada campo de texto
• Registrando um tratador de evento
– Chamando método addActionListener para registrar
um objeto ActionListener
– ActionListener observa eventos no objeto
TratadorCampoDeTexto tratador = new TratadorCampoDeTexto();
campoDeTexto1.addActionListener( tratador );
 2005 Pearson Education, Inc. All rights reserved.
43
Erro comum de programação
Esquecer de registrar um objeto tratador de evento para
tratar um evento particular de componente gráfico faz
com que os eventos sejam ignorados.
 2005 Pearson Education, Inc. All rights reserved.
Detalhes do método actionPerformed
da classe TratadorCampoDeTexto
44
• Fonte do evento
– Componente na qual o evento foi originado
– Pode ser determinada usando o método getSource
– Texto de um JTextField pode ser obtido usando
getActionCommand
– Texto de um JPasswordField pode ser obtido usando
getPassword (retorna um char[])
private class TratadorCampoDeTexto implements ActionListener
{
// processa eventos no campo de texto
public void actionPerformed( ActionEvent event )
{
String string = ""; // declara string a apresentar
// usuario clicou Enter no JTextField campoDeTexto1
if ( event.getSource() == campoDeTexto1 )
string = String.format( "campoDeTexto1: %s",
event.getActionCommand() );
 2005 Pearson Education, Inc. All rights reserved.
 Tipos de eventos gráficos comuns e
interfaces Listener
45
• Tipos de eventos
– Todos são subclasses de AWTEvent
– Alguns declarados no pacote java.awt.event
– Aqueles específicos dos componentes Swing são declarados em
javax.swing.event
• Modelo de evento de delegação:
– A origem do evento é o componente com o qual o
usuário interage.
– O objeto do evento é criado e contém as informações
sobre o evento que aconteceu.
– O ouvinte de evento é notificado quando um evento
acontece.
 2005 Pearson Education, Inc. All rights reserved.
46
Algumas classes de evento do pacote java.awt.event.
 2005 Pearson Education, Inc. All rights reserved.
47
Algumas interfaces comuns do pacote java.awt.event.
 2005 Pearson Education, Inc. All rights reserved.
48
Invocação do tratamento de evento
• Eventos são notificados para apenas um tratador de
evento que casa com o tipo de evento
– Eventos tem um único event ID especificando o tipo de evento
• ActionEvents são manipulados pelos
ActionListeners
• MouseEvents são manipulados pelos MouseListeners
e MouseMotionsListeners
• KeyEvents são manipulados por KeyListeners
 2005 Pearson Education, Inc. All rights reserved.
49
Tratamento de evento
• Perguntas remanescentes:
– Como o handler de evento ficou registrado?
– Como o componente GUI sabe chamar
actionPerformed em vez de algum outro
método de tratamento de evento?
• Cada JComponent tem uma variável de
instância listenerList:
– Objeto do tipo EventListenerList.
– Mantém referências a todos os seus ouvintes
registrados.
 2005 Pearson Education, Inc. All rights reserved.
Registro de evento para
JTextField textField1
50
 2005 Pearson Education, Inc. All rights reserved.
51
 JButton
• Botão
– Componente que o usuário clica para lançar uma ação
específica
– Pode ser botões de comando, caixas de marcação (check
box), botões de alternância e botões de opção
– Tipos de botões são subclasses de AbstractButton
 2005 Pearson Education, Inc. All rights reserved.
52
Hierarquia do Botão Swing.
 2005 Pearson Education, Inc. All rights reserved.
53
 JButton
• Botões de comando
– Criado com a classe JButton
– Texto na face do botão é chamado de rótulo (label) do
botão
– Gera um ActionEvent quando ele é clicado
 2005 Pearson Education, Inc. All rights reserved.
1
2
3
// Arquivo: FrameBotao.java
// Cria JButtons.
import java.awt.FlowLayout;
4
5
6
7
8
9
import
import
import
import
import
import
Resumo
java.awt.event.ActionListener;
java.awt.event.ActionEvent;
javax.swing.JFrame;
javax.swing.JButton;
javax.swing.Icon;
javax.swing.ImageIcon;
10 import javax.swing.JOptionPane;
11
12 public class FrameBotao extends JFrame
13 {
14
private JButton plainJButton; // botão com um texto
15
private JButton fancyJButton; // botão com icones
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
54
FrameBotao.java
(1 de 2)
Declara dois atributos JButton
// FrameBotao adiciona JButtons ao JFrame
public FrameBotao()
{
super( "Testando botões " );
setLayout( new FlowLayout() ); // define frame layout
Cria novo JButton
dois ImageIcons
plainJButton = new JButton( "Plain Button" ); // botão Cria
com texto
add( plainJButton ); // adiciona plainJButton ao JFrame
Cria novo JButton
Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) );
Icon bug2 = new ImageIcon( getClass().getResource( "bug2.gif" ) );
Define rollover icon para
fancyJButton = new JButton( "Fancy Button", bug1 ); // set image
fancyJButton.setRolloverIcon( bug2 ); // set rollover image JButton
add( fancyJButton ); // adiciona fancyJButton ao JFrame
 2005 Pearson Education, Inc. All rights reserved.
31
32
33
34
Resumo
TratadorBotao tratador = new TratadorBotao();
fancyJButton.addActionListener(tratador);
35
36
37
38
39
plainJButton.addActionListener(tratador);
} // fim do construtor FrameBotao
40
{
Cria tratador para botões
// classe interna para tratar eventos do botão
private class TratadorBotao implements ActionListener
41
42
// trata eventos do botão
public void actionPerformed( ActionEvent event )
43
{
44
45
46
47
55
// cria novo ButtonHandler para tratar eventos do botão
FrameBotao.java
(2 de 2)
Registra tratador de eventos
Classe interna implementa
ActionListener
JOptionPane.showMessageDialog( FrameBotao.this, String.format(
"Você clicou: %s", event.getActionCommand() ) );
} // fim do método actionPerformed
Acesso a atributo
} // fim da classe interna TratadorBotao
48 } // fim da classe FrameBotao
da classe externa
usando a referência this
Obtém texto do JButton clicado
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: TesteBotao.java
2
// Testando FrameBotao.
3
import javax.swing.JFrame;
56
Resumo
4
5
public class TesteBotao
6
{
7
public static void main( String args[] )
8
{
TesteBotao.java
(1 de 1)
9
FrameBotao frameBotao = new FrameBotao (); // cria FrameBotao
10
frameBotao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
frameBotao.setSize( 275, 110 ); // define o tamanho do frame
12
frameBotao.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe TesteBotao
 2005 Pearson Education, Inc. All rights reserved.
57
 JButton
•JButtons pode ter um ícone de alternância
(rollover icon)
– Aparece quando o mouse é posicionado sobre o botão
– Adicionado ao JButton com o método
setRolloverIcon
Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) );
Icon bug2 = new ImageIcon( getClass().getResource( "bug2.gif" ) );
fancyJButton = new JButton( "Fancy Button", bug1 ); // set image
fancyJButton.setRolloverIcon( bug2 ); // set rollover image
add( fancyJButton ); // adiciona fancyJButton ao JFrame
 2005 Pearson Education, Inc. All rights reserved.
58
Observação
Quando usado na classe interna, a palavra-chave this
referencia o objeto da classe interna atualmente sendo
manipulado. Um método da classe interna pode acessar
o objeto da classe externa precedendo o this do nome
da classe externa e um ponto, como em
FrameBotao.this.
 2005 Pearson Education, Inc. All rights reserved.
59
 Botões que mantém um estado
• Botões com estado
– Swing contém três tipos de botões com estado
– JToggleButton, JCheckBox and JRadioButton
– JCheckBox e JRadioButton são subclasses de
JToggleButton
 2005 Pearson Education, Inc. All rights reserved.
60
 JCheckBox
•JCheckBox
– Contém um rótulo que aparece na direita do check box por
default
– Gera um ItemEvent quando este é clicado
• ItemEvents são tratados por ItemListener
• Passado para o método itemStateChanged
– Método isSelected retorna se o check box é selecionado
(true) ou não (false)
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: CheckBoxFrame.java
2
// Criando botões JCheckBox.
3
4
import java.awt.FlowLayout;
import java.awt.Font;
5
6
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
7
8
9
10
11
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
61
Outline
public class CheckBoxFrame extends JFrame
CheckBoxFrame
.java
(1 de 3)
Declara dois atributos JCheckBox
12 {
13
14
15
private JTextField campoDeTexto; // apresenta texto com fonte definida
private JCheckBox boldJCheckBox; // para selecionar/não selecionar negrito
private JCheckBox italicJCheckBox; // para selecionar/não selecionar italic
16
17
// Construtor CheckBoxFrame adiciona JCheckBoxes ao JFrame
18
19
20
public CheckBoxFrame()
{
super( "Teste de JCheckBox" ); // define titulo
21
setLayout( new FlowLayout() ); // define frame layout
Define fonte do campo de texto
22
23
// Configura JTextField e define sua fonte
24
25
26
campoDeTexto = new JTextField( "Observe a troca do estilo da fonte", 20 );
campoDeTexto.setFont( new Font( "Serif", Font.PLAIN, 14 ) );
add( campoDeTexto ); // adiciona textField ao JFrame
27
 2005 Pearson Education, Inc. All rights reserved.
28
29
30
boldJCheckBox = new JCheckBox( "Bold" ); // cria bold checkbox
italicJCheckBox = new JCheckBox( "Italic" ); // cria italic
Outline
add( boldJCheckBox ); // adiciona bold checkbox ao JFrame
add( italicJCheckBox ); // adiciona italic checkbox ao JFrame
31
Cria dois JCheckBoxes
32
33
// registra listeners de JCheckBoxes
34
35
CheckBoxHandler handler = new CheckBoxHandler();
boldJCheckBox.addItemListener( handler );
36
italicJCheckBox.addItemListener( handler );
CheckBoxFrame
Cria event handler .java
(2 de 3)
Registra event handler nos
JCheckBoxes
37
38
} // fim do construtor CheckBoxFrame
39
// classe interna privada implementando ItemListener
40
private class CheckBoxHandler implements ItemListener
41
42
{
Classe interna implementando
ItemListener
private int valBold = Font.PLAIN; // controla fonte bold
43
private int valItalic = Font.PLAIN; // controla fonte italic
44
45
46
47
48
49
50
// responde a eventos de checkbox
public void itemStateChanged( ItemEvent event )
{
// processa eventos em bold checkbox
if ( event.getSource() == boldJCheckBox )
valBold =
51
52
62
Método itemStateChanged é
chamado quando um JCheckBox
é clicado
boldJCheckBox.isSelected() ? Font.BOLD : Font.PLAIN;
Testa se JCheckBox é
selecionado
 2005 Pearson Education, Inc. All rights reserved.
53
54
55
56
// processa enventos em italic checkbox
63
Outline
if ( event.getSource() == italicJCheckBox )
valItalic =
Testa fonte do evento
italicJCheckBox.isSelected() ? Font.ITALIC : Font.PLAIN;
57
58
// define fonte do campo de texto
59
campoDeTexto.setFont(
60
61
62
Método isSelected retorna
se
CheckBoxFrame
JCheckBox está selecionado
.java
new Font( "Serif", valBold + valItalic, 14 ) );
} // fim do método itemStateChanged
(3 de 3)
} // fim da classe privada interna CheckBoxHandler
63 } // fim da classe CheckBoxFrame
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: CheckBoxTest.java
2
// Testando CheckBoxFrame.
3
import javax.swing.JFrame;
64
Outline
4
5
public class CheckBoxTest
6
{
7
public static void main( String args[] )
8
{
CheckBoxTest
.java
9
CheckBoxFrame checkBoxFrame = new CheckBoxFrame();
10
checkBoxFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
checkBoxFrame.setSize( 275, 100 ); // configura tamanho do frame
12
checkBoxFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe CheckBoxTest
 2005 Pearson Education, Inc. All rights reserved.
65
 JRadioButton
•JRadioButton
– Tem dois estados – selecionado e não-selecionado
– Normalmente aparece no grupo na qual apenas um botão
pode ser selecionado por vez
• Grupo mantido por um objeto ButtonGroup
– Declara método add para adicionar um
JRadioButton ao grupo
– Usualmente representa opções múltiplas exclusivas
 2005 Pearson Education, Inc. All rights reserved.
66
Erro de programação comum
Adicionar um objeto ButtonGroup (ou um objeto
de qualquer classe que não seja derivado de
Component) ao container resulta em um erro de
compilação.
 2005 Pearson Education, Inc. All rights reserved.
1
2
3
// Arquivo: RadioButtonFrame.java
// Criando botões radio usando ButtonGroup e JRadioButton.
import java.awt.FlowLayout;
4
5
6
7
8
9
import
import
import
import
import
import
67
Outline
java.awt.Font;
java.awt.event.ItemListener;
java.awt.event.ItemEvent;
javax.swing.JFrame;
javax.swing.JTextField;
javax.swing.JRadioButton;
RadioButton
Frame.java
(1 de 3)
10 import javax.swing.ButtonGroup;
11
12 public class RadioButtonFrame extends JFrame
13 {
14
private JTextField textField; // usado para apresentar a troca de fontes
15
private Font plainFont; // fonte para texto plane
16
17
18
19
20
21
private
private
private
private
private
private
22
23
24
25
26
27
private JRadioButton boldItalicJRadioButton; // negrito e itálico
private ButtonGroup radioGroup; // buttongroup para gerenciar botões
28
29
30
Font boldFont; // fonte para texto negrito
Font italicFont; // fonte para texto itálico
Font boldItalicFont; // fonte para texto negrito e itálico
JRadioButton plainJRadioButton; // seleciona texto plano
JRadioButton boldJRadioButton; // seleciona texto negrito
JRadioButton italicJRadioButton; // seleciona texto itálico
Declara quatro
JRadioButtons e um
ButtonGroup para
gerenciar eles
// Construtor RadioButtonFrame adiciona JRadioButtons ao JFrame
public RadioButtonFrame()
{
super( "Teste de RadioButton" );
setLayout( new FlowLayout() ); // define frame layout
 2005 Pearson Education, Inc. All rights reserved.
31
32
33
34
textField = new JTextField( "Observe a mudança do estilo da fonte", 25 );
68
Outline
add( textField ); // adiciona textField ao JFrame
// cria radio buttons
35
36
plainJRadioButton = new JRadioButton( "Plain", true );
boldJRadioButton = new JRadioButton( "Bold", false );
37
38
39
40
41
italicJRadioButton = new JRadioButton( "Italic", false );
Frame.java
boldItalicJRadioButton = new JRadioButton( "Bold/Italic", false );
add( plainJRadioButton ); // adiciona plain button ao JFrame
(2 de 3)
add( boldJRadioButton ); // adiciona bold button ao JFrame
add( italicJRadioButton ); // adiciona italic buttonCria
ao JFrame
quatro JRadioButtons
42
add( boldItalicJRadioButton ); // adiciona bold e italic button
43
44
45
// cria relacionamento lógico entre JRadioButtons
radioGroup = new ButtonGroup(); // cria ButtonGroup
46
radioGroup.add( plainJRadioButton ); // adiciona plain ao grupo
47
radioGroup.add( boldJRadioButton ); // adiciona bold ao grupo
48
49
50
radioGroup.add( italicJRadioButton ); // adiciona italic ao grupo
radioGroup.add( boldItalicJRadioButton ); // adiciona bold and italic
51
// cria objetos font
52
53
plainFont = new Font( "Serif", Font.PLAIN, 14 );
boldFont = new Font( "Serif", Font.BOLD, 14 );
54
55
56
italicFont = new Font( "Serif", Font.ITALIC, 14 );
boldItalicFont = new Font( "Serif", Font.BOLD + Font.ITALIC, 14 );
textField.setFont( plainFont ); // define fonte inicial como plain Font
RadioButton
Cria o ButtonGroup
Adiciona cada JRadioButton ao
ButtonGroup
57
 2005 Pearson Education, Inc. All rights reserved.
58
59
60
61
62
// Registra observadores de eventos aos JRadioButtons
Outline
plainJRadioButton.addItemListener(
new RadioButtonHandler( plainFont ) );
boldJRadioButton.addItemListener(
new RadioButtonHandler( boldFont ) );
69
Registra um event handler a cada
JRadioButton
63
64
65
66
67
italicJRadioButton.addItemListener(
new RadioButtonHandler( italicFont ) );
boldItalicJRadioButton.addItemListener(
new RadioButtonHandler( boldItalicFont ) );
} // fim do construtor RadioButtonFrame
68
69
// classe interna privada que trata os eventos dos radio button
70
71
72
private class RadioButtonHandler implements ItemListener
{
Classe
private Font font; // fonte associada com este listener
RadioButton
Frame.java
(3 of 3)
interna Event handler
implementa ItemListener
73
74
public RadioButtonHandler( Font f )
75
{
76
77
78
font = f; // define o fonte deste listener
} // fim do construtor RadioButtonHandler
79
80
// trata eventos dos radio button
public void itemStateChanged( ItemEvent event )
81
{
Quando radio button é selecionado,
a fonte do campo de texto será
alterada para o valor passa text
field’s font will be set to the value
passed to the constructor
82
textField.setFont( font ); // define a fonte de textField
83
} // fim do método itemStateChanged
84
} // fim da classe interna privada RadioButtonHandler
85 } // fim da classe RadioButtonFrame
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: RadioButtonTest.java
2
// Testando RadioButtonFrame.
3
import javax.swing.JFrame;
70
Outline
4
5
public class RadioButtonTest
6
{
7
public static void main( String args[] )
8
{
RadioButtonTest
.java
9
RadioButtonFrame radioButtonFrame = new RadioButtonFrame();
10
radioButtonFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
radioButtonFrame.setSize( 300, 100 ); // define tamanho do frame
12
radioButtonFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe RadioButtonTest
 2005 Pearson Education, Inc. All rights reserved.
 JComboBox e o uso de classe interna
anônima para tratamento de eventos
71
• Combo box
– Implementada pela classe JComboBox
– Cada item na lista tem um índice
– setMaximumRowCount define o número máximo de
linhas mostrada por vez
– JComboBox oferece uma barra de rolagem e setas cima e
baixo para se navegar na lista
 2005 Pearson Education, Inc. All rights reserved.
72
Usando uma classe interna anônima para
tratamento de eventos
• Classe interna anônima
– Forma especial de classe interna
– Declarada sem um nome
– Normalmente aparece dentro de um método
– Tem um acesso limitado às variáveis locais
 2005 Pearson Education, Inc. All rights reserved.
1
2
3
// Arquivo: ComboBoxFrame.java
// Usando um JComboBox para selecionar uma imagem a apresentar.
import java.awt.FlowLayout;
4
5
6
7
8
9
import
import
import
import
import
import
73
Outline
java.awt.event.ItemListener;
java.awt.event.ItemEvent;
javax.swing.JFrame;
javax.swing.JLabel;
javax.swing.JComboBox;
javax.swing.Icon;
ComboBoxFrame
.java
(1 of 2)
10 import javax.swing.ImageIcon;
11
12 public class ComboBoxFrame extends JFrame
13 {
14
private JComboBox imagesJComboBox; // combobox para manter nomes dos ícones
15
private JLabel label; // label para apresentar o ícone selecionado
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Declara um atributo JComboBox
private String names[] =
{ "bug1.gif", "bug2.gif", "travelbug.gif", "buganim.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 ] ) ) };
// construtor do ComboBoxFrame adiciona JComboBox ao JFrame
public ComboBoxFrame()
{
super( "Testando JComboBox" );
setLayout( new FlowLayout() ); // define frame layout
 2005 Pearson Education, Inc. All rights reserved.
31
32
33
34
35
36
imagesJComboBox = new JComboBox( names ); // define o JComboBox
Cria JComboBox
imagesJComboBox.setMaximumRowCount( 3 ); // apresenta
três linhas
e define número
máximo de linhas
Outline
imagesJComboBox.addItemListener(
new ItemListener() // classe interna anônima
{
Cria classe interna anônima como
ComboBoxFrame
event handler
.java
event )
37
38
// trata eventos JComboBox
public void itemStateChanged( ItemEvent
39
40
41
{
42
43
44
label.setIcon( icons[
imagesJComboBox.getSelectedIndex() ] );
Testa
} // fim do método itemStateChanged
45
46
47
74
Declara método
(2 of 2)
// determina se o check box é selecionado
itemStateChanged
if ( event.getStateChange() == ItemEvent.SELECTED )
} // fim da classe interna anônima
); // fim chamada ao addItemListener
alteração de estado do
JComboBox
Método getSelectedIndex
localiza item selecionado
48
add( imagesJComboBox ); // adiciona combobox ao JFrame
49
label = new JLabel( icons[ 0 ] ); // apresenta primeiro ícone
50
add( label ); // adiciona label ao JFrame
51
} // fim do construtor ComboBoxFrame
52 } // fim da classe ComboBoxFrame
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: ComboBoxTest.java
2
// Testando ComboBoxFrame.
3
import javax.swing.JFrame;
75
Outline
4
5
public class ComboBoxTest
6
{
7
public static void main( String args[] )
8
{
ComboBoxTest
.java
9
ComboBoxFrame comboBoxFrame = new ComboBoxFrame();
10
comboBoxFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
12
13
comboBoxFrame.setSize( 350, 150 ); // define tamanho do frame
comboBoxFrame.setVisible( true ); // apresenta frame
} // fim do main
14 } // fim da classe ComboBoxTest
Barra de rolagem para
visualizar itens na lista
Setas de
rolagem
Caixa de
rolagem
 2005 Pearson Education, Inc. All rights reserved.
76
Observação
Uma classe interna anônima declarada em um
método pode acessar atributos e métodos do
objeto da classe externa que declara ela, tão bem
quanto variáveis locais final do método, mas não
podem acessar variáveis não-final do método.
 2005 Pearson Education, Inc. All rights reserved.
77
 JList
• Lista
– Apresenta uma série de itens na qual pode-se selecionar
um ou mais itens
– Implementada pela classe JList
– Permite uma lista de seleção simples ou múltipla
– Um ListSelectionEvent ocorre quando um item é
selecionado
• Tratado por um ListSelectionListener e passado ao
método valueChanged
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: ListFrame.java
2
3
// Selecionando cores de uma JList.
import java.awt.FlowLayout;
4
5
import java.awt.Color;
import javax.swing.JFrame;
6
7
8
9
10
import
import
import
import
import
78
Outline
javax.swing.JList;
javax.swing.JScrollPane;
javax.swing.event.ListSelectionListener;
javax.swing.event.ListSelectionEvent;
javax.swing.ListSelectionModel;
ListFrame.java
(1 of 2)
11
12 public class ListFrame extends JFrame
13 {
14
15
private JList colorJList; // lista apresentando as cores
private final String colorNames[] = { "Black", "Blue", "Cyan",
16
"Dark Gray", "Gray", "Green", "Light Gray", "Magenta",
17
"Orange", "Pink", "Red", "White", "Yellow" };
18
Declara um atributo JList
private final Color colors[] = { Color.BLACK, Color.BLUE, Color.CYAN,
Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY,
Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE,
Color.YELLOW };
19
20
21
22
23
// Construtor ListFrame adiciona JScrollPane contendo JList ao JFrame
24
public ListFrame()
25
26
27
28
{
super( "Teste de Lista" );
setLayout( new FlowLayout() ); // define frame layout
 2005 Pearson Education, Inc. All rights reserved.
29
30
31
32
33
34
colorJList = new JList( colorNames ); // cria com colorNames
colorJList.setVisibleRowCount( 5 ); // apresenta 5 linhas de uma vez
Outline
Cria JList
// Impede seleções múltiplas
colorJList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
ListFrame.java
modo de seleção do JList
(2 de 2)
35
36
Define
// adiciona um JScrollPane contendo o JList ao frame
add( new JScrollPane( colorJList ) );
37
38
39
colorJList.addListSelectionListener(
new ListSelectionListener() // classe interna Adiciona
anônima
40
41
42
43
44
45
79
JList ao ScrollPane
e o adiciona à aplicação
{
// trata eventos de seleção na lista
public void valueChanged( ListSelectionEvent event )
{
getContentPane().setBackground(
colors[ colorJList.getSelectedIndex() ] );
46
} // fim do método valueChanged
47
} // fim da classe interna anônima
48
); // fim da chamada a addListSelectionListener
49
} // fim do construtor ListFrame
50 } // fim da classe ListFrame
Obtém índice do item selecionado
 2005 Pearson Education, Inc. All rights reserved.
1
// Arqyuvi: ListTest.java
2
// Selecionando cores a partir de uma JList.
3
import javax.swing.JFrame;
80
Outline
4
5
public class ListTest
6
{
ListTest.java
7
public static void main( String args[] )
8
{
9
ListFrame listFrame = new ListFrame(); // cria ListFrame
10
listFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
listFrame.setSize( 350, 150 ); // define tamanho do frame
12
listFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe ListTest
 2005 Pearson Education, Inc. All rights reserved.
81
Lista de seleção múltipla
• Lista de seleção múltipla
– Permite aos usuários selecionarem vários itens
– Seleção de intervalo simples permite apenas um faixa
contínua de itens
– Seleção de intervalo múltiplos permite que qualquer
conjunto seja selecionado
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: MultipleSelectionFrame.java
2
// Copiando itens de uma lista para outra.
3
import java.awt.FlowLayout;
4
import java.awt.event.ActionListener;
5
6
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
7
8
9
10
11
import
import
import
import
82
Outline
Multiple
SelectionFrame
.java
javax.swing.JList;
javax.swing.JButton;
javax.swing.JScrollPane;
javax.swing.ListSelectionModel;
(1 de 3)
12 public class MultipleSelectionFrame extends JFrame
13 {
14
private JList colorJList; // lista que mantém nome das cores
15
private JList copyJList; // lista que terá as cores transferidas
16
private JButton copyJButton; // botão para copiar os nomes selecionados
17
18
19
20
21
22
23
24
private final String colorNames[] = { "Black", "Blue", "Cyan",
"Dark Gray", "Gray", "Green", "Light Gray", "Magenta", "Orange",
"Pink", "Red", "White", "Yellow" };
25
26
// construtor MultipleSelectionFrame
public MultipleSelectionFrame()
{
super( "Multiple Selection Lists" );
setLayout( new FlowLayout() ); // define frame layout
 2005 Pearson Education, Inc. All rights reserved.
27
28
29
colorJList = new JList( colorNames ); // mantém nome de todas as cores
colorJList.setVisibleRowCount( 5 ); // mostra cinco linhas
colorJList.setSelectionMode(
Outline
30
31
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
add( new JScrollPane( colorJList ) ); // adiciona a lista
com lista
scrollpane
Usa uma
de seleção
32
33
34
35
copyJButton = new JButton( "Copy >>>" ); // Cria o botão copy
copyJButton.addActionListener(
36
37
38
39
40
41
42
43
44
45
46
83
de
intervalo múltiplo Multiple
SelectionFrame
.java
new ActionListener() // classe interna anônima
{
// manipula eventos do botão
public void actionPerformed( ActionEvent event )
(2 de 3)
{
// coloca valores selecionados na copyJList
copyJList.setListData( colorJList.getSelectedValues() );
} // fim do método actionPerformed
} // fim da classe interna anônima
Usa método setListData e
); // fim do addActionListener
getSelectedValues para
copiar de uma JList para a outra
 2005 Pearson Education, Inc. All rights reserved.
47
48
49
add( copyJButton ); // adiciona botão copia ao JFrame
Outline
copyJList = new JList(); //cria lista que mantem nomes das cores
Definecopiadas
largura
50
copyJList.setVisibleRowCount( 5 ); // mostra 5 linhas
51
copyJList.setFixedCellWidth( 100 ); // define largura
52
copyJList.setFixedCellHeight( 15 ); // define altura
53
copyJList.setSelectionMode(
54
55
56
84
Define altura
ListSelectionModel.SINGLE_INTERVAL_SELECTION );
Multiple
SelectionFrame
.java
add( new JScrollPane( copyJList ) ); // adiciona lista com scrollpane
} // fim do construtor MultipleSelectionFrame
57 } // fim da classe MultipleSelectionFrame
(3 de 3)
Define modo de seleção para
seleção de intervalo simples
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: MultipleSelectionTest.java
2
3
// Testando MultipleSelectionFrame.
import javax.swing.JFrame;
4
5
public class MultipleSelectionTest
6
7
8
Outline
{
Multiple
SelectionTest
.java
public static void main( String args[] )
{
9
10
MultipleSelectionFrame multipleSelectionFrame =
new MultipleSelectionFrame();
11
multipleSelectionFrame.setDefaultCloseOperation(
12
85
JFrame.EXIT_ON_CLOSE );
13
multipleSelectionFrame.setSize( 350, 140 ); // define tamanho do frame
14
multipleSelectionFrame.setVisible( true ); // apresenta frame
15
} // fim do main
16 } // fim da classe MultipleSelectionTest
 2005 Pearson Education, Inc. All rights reserved.
86
Tratamento de evento de mouse
• Eventos de mouse:
– Cria um objeto MouseEvent.
– Tratado por MouseListeners e
MouseMotionListeners.
– MouseInputListener combina as duas interfaces.
– A interface MouseWheelListener declara o
método mouseWheelMoved para tratar
MouseWheelEvents.
 2005 by Pearson Education do Brasil
87
M
étodosdeinterfaceMouseListenereMouseMotionListener
M
étodosdeinterfaceMouseListener
public void mousePressed( MouseEvent event )
Cham
adoquandoumbotãodom
ouseépressionadoenquantoo
cursordem
ouseestiversobreumcom
ponente.
public void mouseClicked( MouseEvent event )
Cham
adoquandoumbotãodom
ouseépressionadoeliberado
enquantoocursordom
ousepairarsobreumcom
ponente. Esse
eventoésem
preprecedidoporum
acham
adaparamousePressed.
public void mouseReleased( MouseEvent event )
Cham
adoquandoumbotãodom
ouseéliberadodepoisdeser
pressionado. Esseeventosem
preéprecedidoporum
acham
adapara
m
ousePressedeumoum
aischam
adasparamouseDragged.
public void mouseEntered( MouseEvent event )
Cham
adoquandoocursordom
ouseentranoslim
itesdeum
com
ponente.
Métodos de interface MouseListener e MouseMotionListener.
(Parte 1 de 2.)
 2005 by Pearson Education do Brasil
88
M
étodosdeinterfaceMouseListenereMouseMotionListener
public void mouseExited( MouseEvent event )
Cham
adoquandoocursordom
ousedeixaoslim
itesdeum
com
ponente.
M
étodosdeinterfaceMouseMotionListener
public void mouseDragged( MouseEvent event )
Cham
adoquandoobotãodom
ouseépressionadoenquantoocursorde
m
ouseestiversobreumcom
ponenteeom
ouseém
ovidoenquantoo
botãodom
ouseperm
anecerpressionado. Esseeventoésem
pre
precedidoporum
acham
adaparamousePressed. Todososeventosde
arrastarsãoenviadosparaocom
ponenteemqueousuáriocom
eçoua
arrastarom
ouse.
public void mouseMoved( MouseEvent event )
Cham
adoquandoom
ouseém
ovidoquandoocursordem
ouseestiver
sobreumcom
ponente. Todososeventosdem
ovim
entosãoenviados
paraocom
ponentesobreoqual om
ouseatualm
enteestáposicionado.
Métodos de interface MouseListener e MouseMotionListener.
(Parte 2 de 2.)
 2005 by Pearson Education do Brasil
1
2
// Fig. 11.28: MouseTrackerFrame.java
// Demonstrando eventos de mouse.
3
import java.awt.Color;
4
import java.awt.BorderLayout;
5
6
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
7
8
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
9
import javax.swing.JLabel;
89
Resumo
MouseTracker
Frame.java
(1 de 4)
10 import javax.swing.JPanel;
11
12 public class MouseTrackerFrame extends JFrame
13 {
14
15
private JPanel mousePanel; // painel em que eventos de mouse ocorrerão
private JLabel statusBar; // rótulo que exibe informações sobre evento
16
17
// construtor MouseTrackerFrame configura GUI e
18
19
20
21
// registra handlers de evento de mouse
public MouseTrackerFrame()
{
super( "Demonstrating Mouse Events" );
Cria JPanel para capturar eventos de
mouse
Configura o fundo como branco
22
23
mousePanel = new JPanel(); // cria painel
24
mousePanel.setBackground( Color.WHITE ); // configura cor de fundo
25
JLabel
eo
add( mousePanel, BorderLayout.CENTER ); // adiciona Cria
painel
ao JFrame
26
27
statusBar = new JLabel( "Mouse outside JPanel" );
28
29
adiciona à aplicação
add( statusBar, BorderLayout.SOUTH ); // adiciona rótulo ao JFrame
 2005 by Pearson Education do Brasil
30
31
// cria e registra listener para mouse e eventos de movimento de mouse
MouseHandler handler = new MouseHandler();
32
mousePanel.addMouseListener( handler );
33
mousePanel.addMouseMotionListener( handler );
34
} // fim do construtor MouseTrackerFrame
35
36
37
private class MouseHandler implements MouseListener,
MouseMotionListener
38
{
90
Resumo
Cria handler de evento para eventos de
mouse
Registra um handler de evento
MouseTracker
Frame.java
Implementa interfaces ouvintes de mouse
(2 de 4)
39
40
41
42
43
// handlers de evento MouseListener
// trata evento quando o mouse é liberado logo depois de pressionado
public void mouseClicked( MouseEvent event )
{
Declara o método mouseClicked
statusBar.setText( String.format( "Clicked at [%d, %d]",
44
45
event.getX(), event.getY() ) );
} // fim do método mouseClicked
46
47
48
49
// trata evento quando mouse é pressionado
public void mousePressed( MouseEvent event )
{
Determina a localização do clique de mouse
Declara o método mousePressed
statusBar.setText( String.format( "Pressed at [%d, %d]",
50
51
52
53
54
event.getX(), event.getY() ) );
} // fim do método mousePressed
55
public void mouseReleased( MouseEvent event )
56
57
58
59
{
// trata evento quando mouse é liberado depois da operação de arrastar
Declara o método mouseReleased
statusBar.setText( String.format( "Released at [%d, %d]",
event.getX(), event.getY() ) );
} // fim do método mouseReleased
 2005 by Pearson Education do Brasil
60
91
61
62
// trata evento quando mouse entra na área
public void mouseEntered( MouseEvent event )
63
{
statusBar.setText( String.format( "Mouse entered at [%d, %d]",
event.getX(), event.getY() ) );
64
65
66
67
mousePanel.setBackground( Color.GREEN );
} // fim do método mouseEntered
68
69
70
// trata evento quando mouse sai da área
public void mouseExited( MouseEvent event )
71
{
72
73
74
Resumo
Declara o método mouseEntered
MouseTracker
Frame.java
Configura o segundo plano de JPanel
(3 de 4)
Declara o método mouseExited
statusBar.setText( "Mouse outside JPanel" );
mousePanel.setBackground( Color.WHITE );
} // fim do método mouseExited
Configura o segundo plano de JPanel
75
 2005 by Pearson Education do Brasil
76
// MouseMotionListener event handlers
77
// trata evento MouseMotionListener
78
79
public void mouseDragged( MouseEvent event )
{
80
81
92
Resumo
Declara o método mouseDragged
statusBar.setText( String.format( "Dragged at [%d, %d]",
event.getX(), event.getY() ) );
82
83
84
} // fim do método mouseDragged
MouseTracker
Frame.java
// trata evento quanto usuário move o mouse
(4 de 4)
85
86
public void mouseMoved( MouseEvent event )
{
87
88
89
statusBar.setText( String.format( "Moved at [%d, %d]",
event.getX(), event.getY() ) );
} // fim do método mouseMoved
Declara o método mouseMoved
90
} // fim da classe MouseHandler interna
91 } // fim da classe MouseTrackerFrame
 2005 by Pearson Education do Brasil
1
// Fig. 11.29: MouseTrackerFrame.java
2
// Testando MouseTrackerFrame.
3
import javax.swing.JFrame;
93
Resumo
4
5
public class MouseTracker
6
{
7
public static void main( String args[] )
8
{
MouseTracker
Frame.java
(1 de 2)
9
MouseTrackerFrame mouseTrackerFrame = new MouseTrackerFrame();
10
mouseTrackerFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
mouseTrackerFrame.setSize( 300, 100 ); // configura o tamanho do frame
12
mouseTrackerFrame.setVisible( true ); // exibe o frame
13
} // fim de main
14 } // fim da classe MouseTracker
 2005 by Pearson Education do Brasil
94
Classes adaptadoras
• Classe adaptadora:
– Implementa interface ouvinte de evento.
– Fornece implementação-padrão (corpo do método
vazio) para todos os métodos de tratamento de
eventos.
 2005 by Pearson Education do Brasil
95
Observação de engenharia de
software
Quando uma classe implementa uma interface, a
classe tem um relacionamento ‘é um’ com essa
interface. Todas as subclasses diretas e indiretas
dessa classe herdam essa interface. Portanto,
um objeto de uma classe que estende uma classe
adaptadora de evento é um objeto do tipo
ouvinte de eventos correspondente (por
exemplo, um objeto de uma subclasse de
MouseAdapter é um MouseListener).
 2005 by Pearson Education do Brasil
96
Herdando MouseAdapter
• MouseAdapter:
– Classe adaptadora para as interfaces
MouseListener e MouseMotionListener.
– Estender a classe permite sobrescrever somente os
métodos que você deseja utilizar.
 2005 by Pearson Education do Brasil
97
Erro comum de programação
Se você estender uma classe adaptadora e digitar
incorretamente o nome do método que você está
sobrescrevendo, o método simplesmente tornase outro método na classe. Esse é um erro de
lógica difícil de ser detectado, visto que o
programa chamará a versão vazia do método
herdado da classe adaptadora.
 2005 by Pearson Education do Brasil
98
C
l
a
s
s
e
a
d
a
p
t
a
d
o
r
a
d
e
e
v
e
n
t
o
e
m
j
a
v
a
.
a
w
t
.
e
v
e
n
t
I
m
p
l
e
m
e
n
t
a
i
n
t
e
r
f
a
c
e
C
o
m
p
o
n
e
n
t
A
d
a
p
t
e
r
C
o
n
t
a
i
n
e
r
A
d
a
p
t
e
r
F
o
c
u
s
A
d
a
p
t
e
r
K
e
y
A
d
a
p
t
e
r
M
o
u
s
e
A
d
a
p
t
e
r
M
o
u
s
e
M
o
t
i
o
n
A
d
a
p
t
e
r
W
i
n
d
o
w
A
d
a
p
t
e
r
C
o
m
p
o
n
e
n
t
L
i
s
t
e
n
e
r
C
o
n
t
a
i
n
e
r
L
i
s
t
e
n
e
r
F
o
c
u
s
L
i
s
t
e
n
e
r
K
e
y
L
i
s
t
e
n
e
r
M
o
u
s
e
L
i
s
t
e
n
e
r
M
o
u
s
e
M
o
t
i
o
n
L
i
s
t
e
n
e
r
W
i
n
d
o
w
L
i
s
t
e
n
e
r
Classes adaptadoras de evento e as interfaces que elas implementam
no pacote java.awt.event.
 2005 by Pearson Education do Brasil
1
2
// Fig. 11.31: MouseDetailsFrame.java
// Demonstrando cliques de mouse e distinguindo entre botões do mouse.
3
4
import java.awt.BorderLayout;
import java.awt.Graphics;
5
import java.awt.event.MouseAdapter;
6
7
8
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
99
Resumo
MouseDetails
Frame.java
(1 de 2)
9
10 public class MouseDetailsFrame extends JFrame
11 {
12
private String details; // representação String
13
private JLabel statusBar; // JLabel que aparece no botão de janela
14
15
// construtor configura barra de título String e registra o listener de mouse
16
17
18
19
20
21
22
public MouseDetailsFrame()
{
super( "Mouse clicks and buttons" );
23
24
} // fim do construtor MouseDetailsFrame
statusBar = new JLabel( "Click the mouse" );
add( statusBar, BorderLayout.SOUTH );
addMouseListener( new MouseClickHandler() ); // adiciona handler
Registra um handler de evento
 2005 by Pearson Education do Brasil
25
// classe interna para tratar eventos de mouse
26
private class MouseClickHandler extends MouseAdapter
27
{
28
29
30
31
32
100
// trata evento de clique de mouse e determina qual botão foi pressionado
public void mouseClicked( MouseEvent event )
{
int xPos = event.getX(); // obtém posição x do mouse
int yPos = event.getY(); // obtém posição y do mouse
MouseDetails
Frame.java
(2 de 2)
33
34
35
details = String.format( "Clicked %d time(s)",
event.getClickCount() );
Obtém
36
37
if ( event.isMetaDown() ) // botão direito do mouse
38
Resumo
o número de vezes que o botão do mouse
foi clicado
details += " with right mouse button";
Testa se o botão direito do mouse foi clicado
39
40
else if ( event.isAltDown() ) // botão do meio do mouse
details += " with center mouse button";
Testa se o
41
42
else // botão esquerdo do mouse
details += " with left mouse button";
43
44
statusBar.setText( details ); // exibe mensagem na statusBar
botão do meio do mouse foi clicado
45
} // fim do método mouseClicked
46
} // fim da classe interna private MouseClickHandler
47 } // fim da classe MouseDetailsFrame
 2005 by Pearson Education do Brasil
1
// Fig. 11.32: MouseDetails.java
2
// Testando MouseDetailsFrame.
3
4
import javax.swing.JFrame;
5
6
public class MouseDetails
{
7
8
101
Resumo
MouseDetails
.java
public static void main( String args[] )
{
9
10
MouseDetailsFrame mouseDetailsFrame = new MouseDetailsFrame();
mouseDetailsFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
12
mouseDetailsFrame.setSize( 400, 150 ); // configura o tamanho do frame
mouseDetailsFrame.setVisible( true ); // obtém o frame
13
(1 de 2)
} // fim de main
14 } // fim da classe MouseDetails
 2005 by Pearson Education do Brasil
Tabela de Tratamento de Eventos
Origem
Evento
Listener
JTextField
JPasswordField
Jbutton
ActionEvent
ActionListener
JCheckBox
JRadioButton
ItemEvent
ItemListener
itemStateChanged(ItemEvent
e)
JList
ListSectionEvent
ListSelectionListener
actionPerformed(ActionEvent
e)
valueChanged(ListSelectionEve
nt e)
Subclasses de
java.awt.Compone
nt
MouseEvent
MouseListener
mouseClicked(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
Subclasses de
java.awt.Compone
nt
MouseMotionEvent
MouseMotionListener
mouseDragged(MouseEvent e)
mouseMoved(MouseEvent e)
102
Tabela de Tratamento de Eventos
Origem
Evento
Listener
Subclasses de
java.awt.window
WindowEvent
WindowListener
windowActivated(WindowEvent
e)
windowClosed(WindowEvent e)
windowClosing(WindowEvent e)
windowDeactivated(WindowEvent
e)
windowDeiconified(WindowEvent
e)
windowIconified(WindowEvent
e)
windowOpened(WindowEvent e)
Subclasses de
java.awt.Compon
ent
FocusEvent
FocusListener
focusGained(FocusEvent e)
focusLost(FocusEvent e)
JScrollBar
AdjustmentEven
t
AdjustmentListener
adjustmentValueChanged(
AdjustmentEvent e)
JMenu
MenuEvent
MenuListener
menuCanceled(MenuEvent e)
menuDeselected(MenuEvent e)
103
104
Gerenciadores de Layout
• Gerenciadores de Layout
– É oferecida uma forma básica de organização dos
componentes gráficos no container
– Implementam a interface LayoutManager
 2005 Pearson Education, Inc. All rights reserved.
105
Observação
Muitos ambientes de programação oferecem
ferramentas de projeto de interfaces que ajudam o
programador a graficamente definir sua interface; a
ferramenta de projeto em seguida escreve o código
java que implementa a interface. Tais ferramentas
com freqüência oferecem um controle maior quanto
ao tamanho, posição e alinhamento dos componentes
gráficos que os gerenciadores de layout básicos.
 2005 Pearson Education, Inc. All rights reserved.
106
Gerenciador de Descrição
layout
FlowLayout
Default para javax.swing.JPanel. Coloca componentes
sequencialmente (da esquerda para a direita) na ordem em que são
adicionados. Também é possível especificar a ordem dos componentes
usando o método add do Container, que tem o Component e um
índice inteiro (definindo a posição) como argumentos
BorderLayout
Default para JFrames (e outras janelas). Arranja os componentes em
cinco áreas: NORTH, SOUTH, EAST, WEST and CENTER.
GridLayout
Arranja os componentes em linhas e colunas.
Alguns Gerenciadores de Layout.
 2005 Pearson Education, Inc. All rights reserved.
107
 FlowLayout
•FlowLayout
– Gerenciador de layout mais simples
– Componentes são colocados da esquerda para a direita na
ordem em que são adicionados
– Componentes podem ser alinhados a esquerda, centrado
ou a direita
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: FlowLayoutFrame.java
2
// Demonstração do alinhamento de FlowLayout.
3
import java.awt.FlowLayout;
4
import java.awt.Container;
5
6
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
7
8
9
10
11
import javax.swing.JFrame;
import javax.swing.JButton;
108
Outline
FlowLayoutFrame
.java
(1 de 3)
public class FlowLayoutFrame extends JFrame
{
12
13
14
15
private
private
private
private
16
private Container container; // container a configurar layout
17
18
19
20
21
22
23
24
25
26
JButton leftJButton; // botão para configurar alinhamento a esquerda
JButton centerJButton; // botão para configurar alinhamento ao centro
JButton rightJButton; // botão para configurar alinhamento a direita
FlowLayout layout; // objeto layout
// Configurar interface e registrar tratamento de eventos
public FlowLayoutFrame()
{
super( "FlowLayout Demo" );
Cria FlowLayout
layout = new FlowLayout(); // cria FlowLayout
container = getContentPane(); // obtém container para layout
setLayout( layout ); // define frame layout
Define layout da aplicação
 2005 Pearson Education, Inc. All rights reserved.
27
28
29
30
// configura leftJButton e registra listener
109
Outline
leftJButton = new JButton( "Left" ); // cria botão Left
add( leftJButton ); // adiciona botão Left button ao frame
leftJButton.addActionListener(
31
32
33
34
35
36
37
new ActionListener() // classe interna anônima
{
// processa evento em leftJButton
public void actionPerformed( ActionEvent event )
Adiciona JButton;
FlowLayout tratará
FlowLayoutFrame
posicionametno
.java
(2 of 3)
{
layout.setAlignment( FlowLayout.LEFT );
38
39
// realinha componentes anexados
40
layout.layoutContainer( container );
Define alinhamento a esquerda
41
42
43
44
} // fim do método actionPerformed
} // fim da classe interna anônima
); // fim de addActionListener
45
46
47
48
49
50
51
// configura centerJButton e registra listener
centerJButton = new JButton( "Center" ); // cria botão Center
add( centerJButton ); // adiciona botão Center ao frame
centerJButton.addActionListener(
52
53
54
55
56
new ActionListener() // classe interna anônima
{
// processa evento em centerJButton
Ajusta layout
Adiciona JButton;
FlowLayout tratará o
posicionamento
Define
public void actionPerformed( ActionEvent event
)
{
layout.setAlignment( FlowLayout.CENTER );
alinhamento ao centro
 2005 Pearson Education, Inc. All rights reserved.
57
58
59
60
// realinha componentes anexados
110
Outline
layout.layoutContainer( container );
} // fim do método actionPerformed
Reajusta alinhamento
} // fim da classe anônima interna
61
); // fim de addActionListener
62
63
64
65
66
// configura botão rightJButton e registra listener
rightJButton = new JButton( "Right" ); // cria botão Right
add( rightJButton ); // adiciona botão Right ao frame
rightJButton.addActionListener(
67
68
69
70
71
72
73
74
75
76
77
78
79
80
new ActionListener() // classe interna anônima
{
// processa evento rightJButton
public void actionPerformed( ActionEvent event )
{
FlowLayoutFrame
.java
(3 de 3)
Adiciona JButton;
FlowLayout tratará
posicionamento
layout.setAlignment( FlowLayout.RIGHT );
// realinha componentes anexados
layout.layoutContainer( container );
} // fim do método actionPerformed
} // fim da classe interna anônima
); // fim de addActionListener
} // fim do construtor FlowLayoutFrame
Define alinhamento a direita
Reajusta alinhamento
81 } // fim da classe FlowLayoutFrame
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: FlowLayoutDemo.java
2
// Testando FlowLayoutFrame.
3
import javax.swing.JFrame;
111
Outline
4
5
public class FlowLayoutDemo
6
{
7
public static void main( String args[] )
8
{
FlowLayoutDemo
.java
9
FlowLayoutFrame flowLayoutFrame = new FlowLayoutFrame();
10
flowLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
flowLayoutFrame.setSize( 300, 75 ); // configura tamanho do frame
12
flowLayoutFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe FlowLayoutDemo
 2005 Pearson Education, Inc. All rights reserved.
112
 BorderLayout
•BorderLayout
– Organiza componentes em cinco regiões – north, south,
east, west e center
– Implementa a interface LayoutManager2
– Fornece espaçamento horizontal e vertical
 2005 Pearson Education, Inc. All rights reserved.
113
Observação
Se nenhuma região é especificada durante a
adição de um Component ao BorderLayout, o
gerenciador posicionará este componente na
região BorderLayout.CENTER.
 2005 Pearson Education, Inc. All rights reserved.
114
Observação
Cada container pode ter apenas um gerenciador
de layout. Containers separados na mesma
aplicação podem usar diferentes gerenciadores de
layout.
 2005 Pearson Education, Inc. All rights reserved.
115
Erro de programação comum
Quando mais de um componente é adicionado em
uma região no BorderLayout, apenas o último
componente adicionado a esta região será
apresentado. Nenhum erro indicará este problema.
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: BorderLayoutDemo.java
2
// Testando BorderLayoutFrame.
3
import javax.swing.JFrame;
116
Outline
4
5
public class BorderLayoutDemo
6
{
7
public static void main( String args[] )
8
{
BorderLayout
Demo.java
9
BorderLayoutFrame borderLayoutFrame = new BorderLayoutFrame();
10
borderLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
borderLayoutFrame.setSize( 300, 200 ); // define tamanho do frame
12
borderLayoutFrame.setVisible( true ); // apresenta frame
13
(1 de 2)
} // fim do main
14 } // fim da classe BorderLayoutDemo
Espaço horizontal
Espaço vertical
 2005 Pearson Education, Inc. All rights reserved.
117
Outline
BorderLayout
Demo.java
(2 of 2)
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: BorderLayoutFrame.java
2
// Demonstrando BorderLayout.
3
4
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
5
import java.awt.event.ActionEvent;
6
7
8
9
import javax.swing.JFrame;
import javax.swing.JButton;
118
Outline
BorderLayout
Frame.java
public class BorderLayoutFrame extends JFrame implements ActionListener
10 {
11
private JButton buttons[]; // array de botões para esconder porções
12
13
private final String names[] = { "Hide North", "Hide South",
"Hide East", "Hide West", "Hide Center" };
14
private BorderLayout layout; // objeto borderlayout
15
16
17
18
// configura GUI e tratametno de evento
public BorderLayoutFrame()
{
(1 de 2)
Declara atributo BorderLayout
super( "BorderLayout Demo" );
Cria BorderLayout
19
20
21
22
23
24
25
Define
layout = new BorderLayout( 5, 5 ); // espaço de 5 pixel
setLayout( layout ); // configura frame layout
buttons = new JButton[ names.length ]; // define tamanho do array
26
for ( int count = 0; count < names.length; count++ )
27
28
29
30
{
layout
// cria JButtons e registra tratadores de eventos para eles
Registra tratador de evento
buttons[ count ] = new JButton( names[ count ] );
buttons[ count ].addActionListener( this );
} // fim do for
 2005 Pearson Education, Inc. All rights reserved.
31
32
33
119
Outline
add( buttons[ 0 ], BorderLayout.NORTH ); // adiciona botão no north
add( buttons[ 1 ], BorderLayout.SOUTH ); // adiciona botão no south
34
add( buttons[ 2 ], BorderLayout.EAST ); // adiciona botão no east
35
36
add( buttons[ 3 ], BorderLayout.WEST ); // adiciona botão no west
add( buttons[ 4 ], BorderLayout.CENTER ); // adiciona botão no center
37
38
} // fim do construtor BorderLayoutFrame
39
40
41
// trata eventos do botão
public void actionPerformed( ActionEvent event )
{
BorderLayout
Adiciona botões à aplicação usando
Frame.java
constantes do gerenciador de layout
(2 de 2)
42
// Checa a fonte do evento e layout content pane correspondente
43
for ( JButton button : buttons )
44
45
46
47
48
49
50
{
51
layout.layoutContainer( getContentPane() ); // organiza content pane
Torna os botões invisíveis
if ( event.getSource() == button )
button.setVisible( false ); // esconde botão clicado
Torna
else
button.setVisible( true ); // mostra outros botões
} // end for
52
} // fim do método actionPerformed
53 } // fim da classe BorderLayoutFrame
os botões visíveis
Atualiza layout
 2005 Pearson Education, Inc. All rights reserved.
120
 GridLayout
•GridLayout
– Organização na forma de uma grade (linhas e colunas)
– Todo componente tem a mesma altura e largura
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: GridLayoutDemo.java
2
// Testando GridLayoutFrame.
3
import javax.swing.JFrame;
121
Outline
4
5
public class GridLayoutDemo
6
{
7
public static void main( String args[] )
8
{
GridLayoutDemo
.java
9
GridLayoutFrame gridLayoutFrame = new GridLayoutFrame();
10
gridLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
gridLayoutFrame.setSize( 300, 200 ); // configura tamanho do frame
12
gridLayoutFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe GridLayoutDemo
 2005 Pearson Education, Inc. All rights reserved.
1
2
// Arquivo: GridLayoutFrame.java
// Demonstrando GridLayout.
3
4
5
6
import
import
import
import
122
Outline
java.awt.GridLayout;
java.awt.Container;
java.awt.event.ActionListener;
java.awt.event.ActionEvent;
7 import javax.swing.JFrame;
8 import javax.swing.JButton;
9
10 public class GridLayoutFrame extends JFrame implements ActionListener
11 {
12
13
private JButton buttons[]; // array de botões
private final String names[] =
14
15
{ "one", "two", "three", "four", "five", "six" };
private boolean toggle = true; // inverter layouts
16
17
private Container container; // frame container
private GridLayout gridLayout1; // primeiro gridlayout
18
19
20
21
22
23
24
25
26
private GridLayout gridLayout2; // segundo gridlayout
27
28
29
GridLayout
Frame.java
(1 de 2)
Declara dois atributos
GridLayout
// construtor sem argumentos
public GridLayoutFrame()
Cria GridLayout
{
super( "GridLayout Demo" );
gridLayout1 = new GridLayout( 2, 3, 5, 5 ); // 2 por 3; espaço de 5
gridLayout2 = new GridLayout( 3, 2 ); // 3 por 2; sem espaços
container = getContentPane(); // obtém content pane
setLayout( gridLayout1 ); // define JFrame layout
buttons = new JButton[ names.length ]; // cria array de JButtons
Configura layout
 2005 Pearson Education, Inc. All rights reserved.
for ( int count = 0; count < names.length; count++ )
30
31
32
123
Outline
{
buttons[ count ] = new JButton( names[ count ] );
33
buttons[ count ].addActionListener( this ); // registra listener
34
add( buttons[ count ] ); // adiciona botão ao JFrame
} // fim do for
35
36
} // fim do construtor GridLayoutFrame
GridLayout
Adiciona botões ao JFrame
Frame.java
37
38
// trata eventos de botão alterando os layouts
39
public void actionPerformed( ActionEvent event )
40
{
41
42
43
44
(2 de 2)
Usa segundo layout
if ( toggle )
container.setLayout( gridLayout2 ); // configura layout para o secondo
else
Usa primeiro layout
container.setLayout( gridLayout1 ); // configura layout para o primeiro
45
46
toggle = !toggle; // inverte valor de toggle
47
container.validate(); // re-layout do container
48
} // fim do método actionPerformed
Atualiza layout
49 } // fim da classe GridLayoutFrame
 2005 Pearson Education, Inc. All rights reserved.
124
 GridBagLayout
• Gerenciador do Layout GridBagLayout
– É o mais poderoso dos gerenciadores de layout
– Semelhante a GridLayout
• Mas permite que o tamanho de cada componente varie e que
estes possam ser definidos em qualquer ordem.
• Componentes podem ocupar múltiplas linhas e colunas
– Gerenciador mais utilizado e também o mais complexo
• Dado que os demais não têm os facilidades para elaboração
de interfaces mais sofisticadas.
 2005 Pearson Education, Inc. All rights reserved.
125
 GridBagLayout (Cont.)
• Tela é dividida em linhas e colunas
– representando as células que serão ocupadas pelos
componentes;
0
1
2
3
0
1
2
3
4
5
 2005 Pearson Education, Inc. All rights reserved.
126
 GridBagLayout (Cont.)
• Método importante da classe GridBagLayout
– public void setConstraints(Component comp,
GridBagConstraints constraints)
• Define as características de apresentação (restrições) do
component comp no layout.
 2005 Pearson Education, Inc. All rights reserved.
127
 GridBagLayout (Cont.)
• Duas classes são importantes para definição do
layout
– GridBagConstraints
• GridBagConstraints()
• GridBagConstraints(int gridx, int gridy, int gridwidth, int
gridheight, double weightx, double weighty, int anchor, int
fill, Insets insets, int ipadx, int ipady)
– Insets
• Ajustes extras
 2005 Pearson Education, Inc. All rights reserved.
128
 GridBagLayout (Cont.)
gridx
especifica a coluna
gridy
especifica a linha
gridwidth
especifica o número de células ocupadas na linha pelo componente
gridheight
especifica o número de células ocupadas na coluna pelo componente
weightx
especifica como distribuir o espaço horizontal extra
weighty
especifica como distribuir o espaço vertical extra
anchor
determina o alinhamento do objeto. CENTER, NORTH, NORTHEAST, EAST,
SOUTHEAST, SOUTH, SOUTHWEST, WEST, e NORTHWEST. O padrão é
CENTER
fill
permite o redimensionamento do componente quando este é maior
que célula. NONE, HORIZONTAL, VERTICAL, BOTH
insets
permite realizar ajustes extras no posicionamento dos componentes
ipadx
permite ajustes adicionais na linha
ipady
permite ajustes adicionais na coluna
 2005 Pearson Education, Inc. All rights reserved.
129
 GridBagLayout (Cont.)
• Um método útil para simplificar o entendimento
– Sendo constraints = new GridBagConstraints();
// Método para definir posicionamento e adição de componente
private void addComponent( Component component,
int linha, int coluna, int largura, int altura )
{
constraints.gridx = coluna; // set gridx
constraints.gridy = linha; // set gridy
constraints.gridwidth = largura; // set gridwidth
constraints.gridheight = altura; // set gridheight
layout.setConstraints( component, constraints ); // set constraints
add( component ); // adiciona componente
} // fim do método addComponent
 2005 Pearson Education, Inc. All rights reserved.
130
 GridBagLayout (Cont.)
• Exemplo de construção da interface
private
private
private
private
JLabel
JLabel
JLabel
JLabel
lblNome = new JLabel("Nome:");
lblSobrenome = new JLabel("Sobrenome:");
lblnumCarteiraTrabalho = new JLabel(“NCT:");
lblSalario = new JLabel("Salario Mensal:");
//Campos de edição
private JTextField
private JTextField
private JTextField
private JTextField
edtNome = new JTextField();
edtSobrenome = new JTextField();
edtnumCarteiraTrabalho = new JTextField();
edtSalario = new JTextField();
private JButton btnConfirmar = new JButton("Confirmar");
private JButton btnCancelar = new JButton("Cancelar");
 2005 Pearson Education, Inc. All rights reserved.
131
 GridBagLayout (Cont.)
• Exemplo de construção da interface
layout = new GridBagLayout();
setLayout(layout);
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.insets = new Insets(10, 10, 0, 10);
addComponent(lblNome, 0, 0, 1, 1);
addComponent(edtNome, 0, 1, 3, 1);
addComponent(lblSobrenome, 1, 0, 1, 1);
addComponent(lblnumCarteiraTrabalho, 2, 0, 1, 1);
addComponent(lblSalario, 3, 0, 1, 1);
addComponent(edtSobrenome, 1, 1, 3, 1);
addComponent(edtnumCarteiraTrabalho, 2, 1, 3, 1);
addComponent(edtSalario, 3, 1, 3, 1);
addComponent(btnConfirmar, 4, 2, 1, 1);
addComponent(btnCancelar, 4, 3, 1, 1);
 2005 Pearson Education, Inc. All rights reserved.
132
 GridBagLayout (Cont.)
• Insets(int top, int left, int bottom, int right)
top
a distância em relação ao topo
left
a distância em relação a esquerda
bottom
a distância em relação a base
right
a distância em relação a direita
top
left
right
bottom
 2005 Pearson Education, Inc. All rights reserved.
133
 GridBagLayout (Cont.)
• Insets(int top, int left, int bottom, int right)
– constraints.insets = new Insets(20, 12, 15, 25);
20
25
12
15
 2005 Pearson Education, Inc. All rights reserved.
 Usando Panels para gerenciar layouts
mais complexos
134
• Interfaces gráficas complexas com freqüência
requerem vários painéis para organizar seus
componentes de modo apropriado
 2005 Pearson Education, Inc. All rights reserved.
1
2
// Arquivo: PanelFrame.java
// Usando um Jpanel para ajudar organizar componentes.
3
4
5
6
import
import
import
import
7
8
9
import javax.swing.JButton;
135
Outline
java.awt.GridLayout;
java.awt.BorderLayout;
javax.swing.JFrame;
javax.swing.JPanel;
PanelFrame.java
(1 de 2)
public class PanelFrame extends JFrame
10 {
11
private JPanel buttonJPanel; // painél para apresentar botões
12
13
private JButton buttons[]; // array de botões
14
15
16
// construtor sem argumentos
public PanelFrame()
{
17
super( "Panel Demo" );
18
19
20
21
buttons = new JButton[ 5 ]; // cria o array de botões
buttonJPanel = new JPanel(); // configura painél
buttonJPanel.setLayout( new GridLayout( 1, buttons.length ) );
Declara um JPanel para
apresentar botões
Cria JPanel
Configura layout
 2005 Pearson Education, Inc. All rights reserved.
22
23
24
25
// cria e adiciona botões
136
Outline
for ( int count = 0; count < buttons.length; count++ )
{
buttons[ count ] = new JButton( "Button " + ( count + 1 ) );
26
27
buttonJPanel.add( buttons[ count ] ); // adiciona botões ao JPanel
} // end for
28
29
add( buttonJPanel, BorderLayout.SOUTH ); //
30
} // fim do construtor PanelFrame
31 } // fim da classe PanelFrame
PanelFrame.java
Adiciona o painel de botões
adicional Jpanel ao JFrame
(2 de 2)
Adiciona painel à aplicação
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: PanelDemo.java
2
// Testando PanelFrame.
3
import javax.swing.JFrame;
137
Outline
4
5
public class PanelDemo extends JFrame
6
{
PanelDemo.java
7
public static void main( String args[] )
8
{
9
PanelFrame panelFrame = new PanelFrame();
10
panelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
panelFrame.setSize( 450, 200 ); // configura tamanho do frame
12
panelFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe PanelDemo
 2005 Pearson Education, Inc. All rights reserved.
138
 Usando Menus com Frames
• Menus
– Permite ao usuário solicitar ações
– Pode ser anexado apenas a objetos da classe que têm o
método setMenuBar, tal como JFrame e JApplet
– Classe MenuBar
• Contém métodos necessários para gerenciar uma barra de
menu
– Classe JMenu
• Contém os métodos necessário para gerenciar menus
– Classe JMenuItem
• Contém os métodos necessários para gerenciar itens de menu
 2005 Pearson Education, Inc. All rights reserved.
139
 Usando Menus com Frames (Cont.)
– Classe JCheckBoxMenuItem
• Contém os métodos necessários para gerenciar itens de
menus que pode ser colocados como on ou off
– Classe JRadioButtonMenuItem
• Contém os métodos necessários para gerenciar itens de menu
que podem ser on ou off como em JCheckBoxMenuItems
• Quando vários JRadioButtonMenuItems são mantidos
como parte de um ButtonGroup, apenas um item no grupo
pode ser selecionado
– Mnemônicos
• Caracteres especiais que podem oferecer acesso rápido ao
menu ou item do menu a partir do teclado
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: MenuTest.java
2
// Testando MenuFrame.
3
import javax.swing.JFrame;
140
Outline
4
5
public class MenuTest
6
{
MenuTest.java
7
public static void main( String args[] )
8
{
(1 de 2)
9
MenuFrame menuFrame = new MenuFrame(); // cria MenuFrame
10
menuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
menuFrame.setSize( 500, 200 ); // define tamanho do frame
12
menuFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe MenuTest
Menu
Caracteres
mnemônicos
Barra de
menu
 2005 Pearson Education, Inc. All rights reserved.
141
Outline
Submenu
expandido
MenuTest.java
(2 de 2)
Menu items
Linha
separadora
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: MenuFrame.java
2
3
// Demonstrando menus.
import java.awt.Color;
4
import java.awt.Font;
5
6
7
8
9
10
import
import
import
import
import
import
142
Outline
java.awt.BorderLayout;
java.awt.event.ActionListener;
java.awt.event.ActionEvent;
java.awt.event.ItemListener;
java.awt.event.ItemEvent;
javax.swing.JFrame;
MenuFrame.java
(1 de 8)
11 import javax.swing.JRadioButtonMenuItem;
12 import javax.swing.JCheckBoxMenuItem;
13 import javax.swing.JOptionPane;
14 import javax.swing.JLabel;
15 import javax.swing.SwingConstants;
16 import javax.swing.ButtonGroup;
17 import javax.swing.JMenu;
18 import javax.swing.JMenuItem;
19 import javax.swing.JMenuBar;
20
 2005 Pearson Education, Inc. All rights reserved.
21 public class MenuFrame extends JFrame
22 {
23
24
143
Outline
private final Color colorValues[] =
{ Color.BLACK, Color.BLUE, Color.RED, Color.GREEN };
25
26
private JRadioButtonMenuItem colorItems[]; // itens do menu: cores
private JRadioButtonMenuItem fonts[]; // itens de menu: fontes
27
28
29
private JCheckBoxMenuItem styleItems[]; // itens de menu: estilo da fonte
private JLabel displayJLabel; // apresenta texto de teste
private ButtonGroup fontButtonGroup; // gerencia itens do menu fonte
30
31
private ButtonGroup colorButtonGroup; // gerencia itens do menu cores
private int style; // usado para criar estilo para a fonte
32
33
// construtor sem argumentos que configura a interface
34
35
public MenuFrame()
{
36
37
38
39
40
41
42
43
44
45
46
MenuFrame.java
(2 de 8)
Cria um JMenu
super( "Using JMenus" );
JMenu fileMenu = new JMenu( "File" ); // cria menu file
fileMenu.setMnemonic( 'F' ); // configura mnemonico para F
Chama método JMenu
setMnemonic
// cria item do menu About...
JMenuItem aboutItem = new JMenuItem( "About..." );
Adiciona the JMenuItem
aboutItem.setMnemonic( 'A' ); // configura mnemonico para A
“About…” ao fileMenu
fileMenu.add( aboutItem ); // adiciona item about ao menu file
aboutItem.addActionListener(
 2005 Pearson Education, Inc. All rights reserved.
47
48
49
new ActionListener() // classe interna anônima
Outline
{
// apresenta o caixa de mensagem quando o usuario
50
public void actionPerformed( ActionEvent event )
51
{
52
53
54
55
JOptionPane.showMessageDialog( MenuFrame.this,
"This is an example\nof using menus",
"About", JOptionPane.PLAIN_MESSAGE );
} // fim do método actionPerformed
56
57
58
59
60
61
} // fim da classe interna anônima
); // fim de addActionListener
62
63
64
65
66
67
exitItem.addActionListener(
68
69
70
71
72
73
Cria um ActionListener para 144
processar eventos de ação em
seleciona About...
aboutItem
Apresenta uma caixa de
mensagem
de dialogo
MenuFrame.java
(3 de 8)
JMenuItem exitItem = new JMenuItem( "Exit" ); // Cria item exit
exitItem.setMnemonic( 'x' ); // configura mnemonico x
fileMenu.add( exitItem ); // adiciona item exit ao menu file
Cria e adiciona o
item de menu
exitItem
Registra um
ActionListener que
encerra a aplicação
new ActionListener() // classe interna anônima
{
// termina aplicação quando o usuario clica em exitItem
public void actionPerformed( ActionEvent event )
{
System.exit( 0 ); // fim da aplicação
} // fim do método actionPerformed
} // fim da classe anônima interna
); // fim de addActionListener
 2005 Pearson Education, Inc. All rights reserved.
74
75
76
JMenuBar bar = new JMenuBar(); // cria barra de menu
Outline
Adiciona fileMenu ao
JMenuBar e anexa o
JMenuBar à janela da
formataplicação
77
78
JMenu formatMenu = new JMenu( "Format" ); // cria menu
79
80
81
82
83
formatMenu.setMnemonic( 'r' ); // configura mnemonico r
MenuFrame.java
(4 de 8)
Cria menu formatMenu
// array dos nomes das cores
String colors[] = { "Black", "Blue", "Red", "Green" };
84
JMenu colorMenu = new JMenu( "Color" ); // cria menu color
85
86
colorMenu.setMnemonic( 'C' ); // configura mnemonico C
87
// cria menu de itens radiobutton para as cores
88
89
90
colorItems = new JRadioButtonMenuItem[ colors.length ];
colorButtonGroup = new ButtonGroup(); // gerencia cores
Cria array
ItemHandler itemHandler = new ItemHandler(); // trata eventos para
cores
JRadioButtonMenuItem
91
92
93
94
95
// cria itens do menu color com botão radio
for ( int count = 0; count < colors.length; count++ )
{
colorItems[ count ] =
96
97
98
99
100
101
145
setJMenuBar( bar ); // adiciona barra de menu à aplicação
bar.add( fileMenu ); // adiciona menu file à barra de menu
cria submenu colorMenu
colorItems
Cria um ButtonGroup para
assegurar que apenas um dos
itens de menu seja selecionado
item por vez
new JRadioButtonMenuItem( colors[ count ] ); // cria
colorMenu.add( colorItems[ count ] ); // adiciona item ao menu color
colorButtonGroup.add( colorItems[ count ] ); // adiciona ao grupo
colorItems[ count ].addActionListener( itemHandler );
} // fim do for
Adiciona JRadioButtonMenuItems ao
colorMenu e registra ActionListeners
 2005 Pearson Education, Inc. All rights reserved.
102
103
104
colorItems[ 0 ].setSelected( true ); // seleciona primeiro item de Color
Outline
Chama
formatMenu.add( colorMenu ); // adiciona menu color ao menu format
105
formatMenu.addSeparator(); // adiciona separador no menu
106
107
// array com nomes das fontes
método
AbstractButton
setSelected
MenuFrame.java
108
109
110
111
112
String fontNames[] = { "Serif", "Monospaced", "SansSerif" };
JMenu fontMenu = new JMenu( "Font" ); // cria menu font
fontMenu.setMnemonic( 'n' ); // define mnemonico n
113
114
115
116
fonts = new JRadioButtonMenuItem[ fontNames.length ];
fontButtonGroup = new ButtonGroup(); // gerencia nomes das fontes
Cria
117
118
119
120
121
122
123
124
125
126
127
146
// cria itens de menu radiobutton para nomes das fontes
(5 de 8)
Adiciona colorMenu ao
formatMenu e adiciona uma
linha de separação horizontal
array de
JRadioButtonMenuItem
// cria itens de menu Font radio button
fonts
for ( int count = 0; count < fonts.length; count++ )
Cria um ButtonGroup para
{
assegurar que apenas um dos
fonts[ count ] = new JRadioButtonMenuItem( fontNames[ count ] );
fontMenu.add( fonts[ count ] ); // adiciona fonte ao menu font itens do menu sejam
selecionados por vez
fontButtonGroup.add( fonts[ count ] ); // adiciona ao button group
fonts[ count ].addActionListener( itemHandler ); // adiciona handler
} // end for
fonts[ 0 ].setSelected( true ); // seleciona primeiro item do menu Font
fontMenu.addSeparator(); // adiciona separador ao menu Font
Adiciona JRadioButtonMenuItems ao
colorMenu e registra ActionListeners
Configura seleção default e adiciona separador
horizontal
 2005 Pearson Education, Inc. All rights reserved.
128
129
130
String styleNames[] = { "Bold", "Italic" }; // nomes dos estilos
Outline
147
styleItems = new JCheckBoxMenuItem[ styleNames.length ];
StyleHandler styleHandler = new StyleHandler(); // handler para estilos
131
132
// cria itens do menu Style como checkbox
133
134
135
136
137
for ( int count = 0; count < styleNames.length; count++ )
MenuFrame.java
{
Cria JCheckBoxMenuItems
styleItems[ count ] =
(6 de 8)
new JCheckBoxMenuItem( styleNames[ count ] ); // para estilo
fontMenu.add( styleItems[ count ] ); // adiciona ao menu font
138
styleItems[ count ].addItemListener( styleHandler ); // handler
139
140
141
142
143
} // fim do for
144
// Configura label para apresentar o texto
145
146
147
148
149
150
151
displayJLabel = new JLabel( "Sample Text", SwingConstants.CENTER );
displayJLabel.setForeground( colorValues[ 0 ] );
displayJLabel.setFont( new Font( "Serif", Font.PLAIN, 72 ) );
formatMenu.add( fontMenu ); // adiciona
bar.add( formatMenu ); // adiciona menu
Adiciona fontMenu ao
e formatMenu ao
menu Font ao menu formatMenu
Format
Format à barra de JMenuBar
menu
getContentPane().setBackground( Color.CYAN ); // configura cor de fundo
add( displayJLabel, BorderLayout.CENTER ); // adiciona displayJLabel
} // fim do construtor de MenuFrame
152
 2005 Pearson Education, Inc. All rights reserved.
153
// classe interna tratando eventos action dos itens do menu
154
Outline
155
148
private class ItemHandler implements ActionListener
{
156
// processa seleção de fontes e cores
157
158
public void actionPerformed( ActionEvent event )
{
159
160
161
162
163
// processa seleção de cores
for ( int count = 0; count < colorItems.length; count++ )
{
if ( colorItems[ count ].isSelected() )
{
164
165
166
167
displayJLabel.setForeground( colorValues[ count ] );
break;
} // fim do if
} // fim do for
MenuFrame.java
(7 de 8)
Determina o
JRadioButtonMenuItem
selecionado
168
169
170
171
172
173
174
175
176
// processa seleção da fonte
for ( int count = 0; count < fonts.length; count++ )
{
Método getSource retorna uma
if ( event.getSource() == fonts[ count ] )
referência ao
{
JRadioButtonMenuItem que
displayJLabel.setFont(
new Font( fonts[ count ].getText(), style, 72 gerou
) ); o evento
} // fim do if
177
178
} // fim do for
 2005 Pearson Education, Inc. All rights reserved.
repaint(); // desenha novamente a aplicação
179
180
181
149
Outline
} // fim do método actionPerformed
} // fim da classe ItemHandler
182
183
184
// classe interna para tratar item events dos itens do menu check box
private class StyleHandler implements ItemListener
185
186
187
188
189
{
190
191
192
193
// processa seleção de fonte e estilo
public void itemStateChanged( ItemEvent e )
{
style = 0; // inicializa style
// checa se bold é selecionado
if ( styleItems[ 0 ].isSelected() )
style += Font.BOLD; // adiciona bold ao style
194
195
196
197
198
199
200
201
202
MenuFrame.java
Chamado se o usuário seleciona
um8)
(8 de
JCheckBoxMenuItem em fontMenu
Determina se um ou os dois
JCheckBoxMenuItems estão
selecionados
// checa se italic é selecionado
if ( styleItems[ 1 ].isSelected() )
style += Font.ITALIC; // adiciona italic ao style
displayJLabel.setFont(
new Font( displayJLabel.getFont().getName(), style, 72 ) );
repaint(); // desenha novamente a aplicação
} // fim do método itemStateChanged
203
} // fim da classe StyleHandler
204 } // fim da classe MenuFrame
 2005 Pearson Education, Inc. All rights reserved.
150
 JTabbedPane
•JTabbedPane
– Organiza componentes gráficos em camadas em que
apenas uma camada é visível por vez
• Quando o usuário clica na guia, a camada apropriada é
apresentada
– As guias podem ser posicionados no topo (default),
esquerda, direita ou embaixo
– Qualquer componente pode ser colocado em uma guia
– Se as guias não couberem em uma linha, eles serão
colocados em linhas adicionais
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: JTabbedPaneDemo.java
2
// Demonstrando JTabbedPane.
3
import javax.swing.JFrame;
151
Outline
4
5
public class JTabbedPaneDemo
6
{
7
public static void main( String args[] )
8
{
JTabbedPane
Demo.java
9
JTabbedPaneFrame tabbedPaneFrame = new JTabbedPaneFrame();
10
tabbedPaneFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11
tabbedPaneFrame.setSize( 250, 200 ); // define tamanho do frame
12
tabbedPaneFrame.setVisible( true ); // apresenta frame
13
} // fim do main
14 } // fim da classe JTabbedPaneDemo
 2005 Pearson Education, Inc. All rights reserved.
1
// Arquivo: JTabbedPaneFrame.java
2
// Demonstrando JTabbedPane.
3
import java.awt.BorderLayout;
4
import java.awt.Color;
5
6
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
7
8
9
10
11
import
import
import
import
152
Outline
JTabbedPane
Frame.java
javax.swing.JLabel;
javax.swing.JPanel;
javax.swing.JButton;
javax.swing.SwingConstants;
(1 de 2)
12 public class JTabbedPaneFrame extends JFrame
13 {
14
// configura interface
Cria
15
public JTabbedPaneFrame()
16
17
18
19
20
21
22
23
24
25
26
um JTabbedPane vazio com as configurações
default
{
super( "JTabbedPane Demo " );
JTabbedPane tabbedPane = new JTabbedPane(); // cria JTabbedPane
// configura pane11 e adiciona este ao JTabbedPane
JLabel label1 = new JLabel( "panel one", SwingConstants.CENTER );
JPanel panel1 = new JPanel(); // cria primeiro painel
panel1.add( label1 ); // adiciona label ao painel
tabbedPane.addTab( "Tab One", null, panel1, "First Panel" );
Chama método JTabbedPane addTab com argumentos que especificam o
título da guia, uma referência a interface Icon para apresentar na guia, o
COMPONENT a apresentar quando o usuário clica na guia e a string tooltip
da guia
 2005 Pearson Education, Inc. All rights reserved.
27
28
29
// configura panel2 e o adiciona JTabbedPane
JLabel label2 = new JLabel( "panel two", SwingConstants.CENTER );
153
Outline
JPanel panel2 = new JPanel(); // cria segundo painel
30
31
panel2.setBackground( Color.YELLOW ); // configura fundo amarelo
panel2.add( label2 ); // adiciona label ao panel
32
33
34
35
tabbedPane.addTab( "Tab Two", null, panel2, "Second Panel" );
// configura panel3 e o adiciona ao JTabbedPane
JLabel label3 = new JLabel( "panel three" );
36
37
38
39
JPanel panel3 = new JPanel(); // cria terceiro
panel3.setLayout( new BorderLayout() ); // usa borderlayout
panel3.add( new JButton( "North" ), BorderLayout.NORTH );
panel3.add( new JButton( "West" ), BorderLayout.WEST );
40
41
42
panel3.add( new JButton( "East" ), BorderLayout.EAST );
panel3.add( new JButton( "South" ), BorderLayout.SOUTH );
panel3.add( label3, BorderLayout.CENTER );
43
tabbedPane.addTab( "Tab Three", null, panel3, "Third Panel" );
Adiciona panel2 ao
tabbedPane
painel
JTabbedPane
Frame.java
(2 de 2)
44
45
add( tabbedPane ); // adiciona JTabbedPane ao frame
46
} // fim do construtor JTabbedPaneFrame
Adiciona
47 } // fim da classe JTabbedPaneFrame
panel3 ao
tabbedPane
 2005 Pearson Education, Inc. All rights reserved.
154
 JMenu e CardLayout
•CardLayout
– Gerenciador de layout que empilha os componentes de um
container de tal forma que apenas o componente que está
no topo permanece visível
– Métodos de navegação first(), next(), previous() e
last()
• Permitem "navegar" entre os componentes empilhados
– determinando qual item deve estar visível em um dado
momento
– permitem realizar uma
varredura seqüencial pelos
componentes de container
especificado
 2005 Pearson Education, Inc. All rights reserved.
155
 JMenu e CardLayout
•CardLayout
– Método show()
• permite selecionar um componente para exposição
diretamente através de uma string
– String especificada como uma restrição quando da
adição do componente ao container
 2005 Pearson Education, Inc. All rights reserved.
// Arquivo: JTabbedPaneDemo.java
// Demonstrando CardLayout.
import javax.swing.JFrame;
156
public class CardLayoutTest
{
public static void main( String args[] )
{
CardLayoutDemo cardLayoutDemo = new CardLayoutDemo();
cardLayoutDemo.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
cardLayoutDemo.setSize( 300, 200 ); // define tamanho do frame
cardLayoutDemo.setResizable(false);
cardLayoutDemo.setVisible( true ); // apresenta frame
} // fim do main
} // fim da classe JGridLayoutBagDemo
CardLayoutTest
.java
 2005 Pearson Education, Inc. All rights reserved.
// Arquivo CardLayoutDemo
// Demonstração do CardLayout
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
157
public class CardLayoutDemo extends JFrame implements ActionListener {
private JPanel cards;
//um JPanel que usa CardLayout
private JMenu menu;
//menu principal Panel
private JMenuItem buttonItem; //item do menu Panel
private JMenuItem textItem;
//item do menu Panel
private JMenuBar bar;
//barra de menu
CardLayoutTest
.java
// Constantes usadas para identificar os JPanels (as Cards)
final static String BUTTONPANEL = "Card with JButtons";
final static String TEXTPANEL = "Card with JTextField";
public CardLayoutDemo () {
// Define o título do aplicativo
super("Demo de CardLayout");
// Cria Menu Panel
menu = new JMenu("Panel");
// Cria itens do menu Panel
buttonItem = new JMenuItem(BUTTONPANEL);
textItem = new JMenuItem(BUTTONPANEL);
menu.add(buttonItem);
menu.add(textItem);
// Associa tratador de eventos aos itens do menu
buttonItem.addActionListener(this);
textItem.addActionListener(this);
// Define a barra de menu com o menu Panel
bar = new JMenuBar();
bar.add(menu);
setJMenuBar( bar );
 2005 Pearson Education, Inc. All rights reserved.
158
// Cria card de botões
JPanel card1 = new JPanel();
card1.add(new JButton("Button 1"));
card1.add(new JButton("Button 2"));
card1.add(new JButton("Button 3"));
CardLayoutTest
.java
// Cria card com campo de texto
JPanel card2 = new JPanel();
card2.add(new JTextField("TextField", 20));
// Cria JPanel com layout CardLayout que conterá as cards
cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
cards.add(card2, TEXTPANEL);
// adiciona cards ao JFrame
add(cards, BorderLayout.CENTER);
}
// Trata os eventos de seleção no menu Panel
public void actionPerformed( ActionEvent event )
{
// Obtém o Layout CardLayout do JPanel
CardLayout cl = (CardLayout)(cards.getLayout());
// Apresenta o JPanel apropriado de acordo com a seleção no menu
if (event.getSource() == buttonItem)
cl.show(cards, BUTTONPANEL);
else
cl.show(cards, TEXTPANEL);
}
}
 2005 Pearson Education, Inc. All rights reserved.
Download