Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Programao Java
Construo de Interface grfica
Grupo de Linguagens de Programao
Departamento de Informtica
PUC-Rio
Processo Bsico:
OO + Eventos
?
Instanciar os componentes de interface
por exemplo, janelas, botes, campos de textos, etc
Adicionar os componentes em containers
por exemplo, como os componentes podem ser
agrupados e qual o layout de diagramao
Estabelecer o tratamento de eventos de interface
por exemplo, o que deve ocorrer quando o usurio
clicar um boto ou como alterar o contedo de um
componente quando um outro sofre alguma alterao
2
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Exemplo
import java.awt.event .*;
import javax.swing.*;
Exemplo
public class JanelaSimples {
public JanelaSimples() {
/* Cria o boto */
final JButton botaoLimpa = new JButton("Limpa");
/* Cria o campo de texto */
final JTextField campoTexto = new JTextField(10);
/* Cria uma janela */
final JFrame janela = new JFrame ("Janela Simples");
janela.setSize(300,100);
/* Adiciona os componentes na janela */
JPanel painel = new JPanel();;
painel.add (botaoLimpa );
painel.add (campoTexto );
janela.getContentPane().add(painel );
/* Quando o usurio clicar no botao, limpa o campo de texto */
botaoLimpa.addActionListener (new ActionListener () {
public void actionPerformed (ActionEvent e) {
campoTexto.setText ("");
}});
/* Exibe a janela */
janela.setVisible(true );
}
}
4
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Hierarquia de Composio
? Componente
qualquer elemento de interface
? Container
um Componente
agrega Componentes
Componente
is-a
contains
Container
5
Exemplo
JFrame
janela
contains
Container
content pane
contains
JPanel
painel
contains
JButton
botaoLimpa
contains
JTextField
campoTexto
6
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Elementos de Interface Swing
Uma janela um top-level container: onde os outros
componentes so desenhados.
? Um painel um container intermedirio: serve para
facilitar o agrupamento de outros componentes.
? Botes e campos de texto so exemplos de
componentes atmicos: elementos de interface que
no agrupam outros componentes. Mostram para o
usurio e/ou obtm dele alguma informao. A API
do Swing oferece muitos componentes atmicos.
?
Alguns Componentes Atmicos
? Campo
de Texto
? Label
? Boto
? CheckBox
? Lista
? Lista dropdown
? Canvas
8
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Classe JComponent
? Superclasse
de muitos elementos do Swing,
? Funcionalidade comum aos componentes
? Disponibiliza mtodos para controlar:
Tool tips
Bordas
Propriedades
javax.swing.JLabel
?
Modela um texto e/ou imagem no editvel, isto ,
sem interao com o usurio
10
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Exemplo de JLabel
/* Cria um label com texto */
JLabel label1 = new JLabel("Label1: Apenas Texto");
/* Cria um label com texto e imagem */
JLabel label2 = new JLabel("Label2: Imagem e texto",
new ImageIcon("javalogo.gif"),
JLabel.CENTER);
label2.setVerticalTextPosition(JLabel.BOTTOM);
label2.setHorizontalTextPosition(JLabel.CENTER);
11
javax.swing.JTextField
?
Modela um campo de edio de texto de uma linha
12
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Exemplo de JTextField
/* Cria um campo de nome */
JTextField campoNome = new JTextField(10);
JLabel labelNome = new JLabel ("Nome: ");
labelNome.setLabelFor (campoNome);
labelNome.setDisplayedMnemonic('n'); // Alt-n
/* Cria um campo de email */
JTextField campoEmail = new JTextField(10);
JLabel labelEmail = new JLabel ("Email: ");
labelEmail.setLabelFor (campoEmail);
labelEmail.setDisplayedMnemonic('E'); // Alt-e
13
javax.swing.JButton
?
Modela um push-button
14
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Exemplo de JButton
/* Cria um botao com texto */
JButton botao1 = new JButton ("Boto Desabilitado");
botao1.setEnabled(false);
botao1.setToolTipText("Exemplo de um boto de texto");
botao1.setMnemonic(KeyEvent.VK_D); // Alt-D
/* Cria um botao com texto e imagem */
JButton botao2 = new JButton("Boto Habilitado", new
ImageIcon("javalogo.gif"));
botao2.setToolTipText("Boto de texto e imagem");
botao2.setMnemonic(KeyEvent.VK_H); // Alt-H
botao2.setPressedIcon(new ImageIcon("javalogo2.gif"));
15
Alguns Containers
? Janela
? Dilogo
? Applet
? Painel
? Scroll
}
}
Pane
Top Level Containers
Containers Intermedirios
16
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
javax.swing.JFrame
Representa uma janela do sistema nativo
? Possui ttulo e borda
? Pode possuir menu
?
17
Exemplo
JFrame janela = new JFrame("Exemplo de Janela");
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel mensagem = new JLabel("Ol Mundo!");
janela.getContentPane().add(mensagem);
janela.setLocationRelativeTo(null); // centraliza
janela.setIconImage(new
ImageIcon("javalogo2.gif").getImage());
JMenuBar menuBar = new JMenuBar();
menuBar.add(new JMenu("Menu"));
janela.setJMenuBar (menuBar);
janela.pack();
janela.show();
18
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
javax.swing.JPanel
? Modela
um container sem decorao.
? Representa um grupo de elementos
? Normalmente usado para estruturar a
interface
associado a um diagramador
19
Diagramadores
? Arrumam um
grupo de elementos
? Esto associados aos containers
? Diferentes estilos de arrumao
como fluxo de texto
orientada pelas bordas
em forma de grade
e outros...
20
10
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
java.awt.FlowLayout
? Coloca
os componentes lado a lado, uma
linha aps a outra
? Alinhamento: centralizado (default),
esquerda ou direita
? Default para o JPanel
21
Exemplo de FlowLayout
Container contentPane = janela.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("Button 1"));
contentPane.add(new JButton("2"));
contentPane.add(new JButton("Button 3"));
contentPane.add(new JButton("Long-Named Button 4"));
contentPane.add(new JButton("Button 5"));
22
11
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
java.awt.BorderLayout
? Divide
o container em 5 reas: norte, sul,
leste, oeste e centro
? Default para content pane do JFrame
23
Exemplo de BorderLayout
Container contentPane = janela.getContentPane();
//contentPane.setLayout(new BorderLayout()); // Desnecessrio
contentPane.add(new JButton("Button 1 (NORTH)"),
BorderLayout.NORTH);
contentPane.add(new JButton("2 (CENTER)"),
BorderLayout.CENTER);
contentPane.add(new JButton("Button 3 (WEST)"),
BorderLayout.WEST);
contentPane.add(new JButton("Long-Named Button 4 (SOUTH)"),
BorderLayout.SOUTH);
contentPane.add(new JButton("Button 5 (EAST)"),
BorderLayout.EAST);
24
12
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
java.awt.GridLayout
? Clulas
do mesmo tamanho especificadas
pelo nmero de linhas e colunas
25
Exemplo de GridLayout
Container contentPane = janela.getContentPane();
contentPane.setLayout(new GridLayout(0,2));
contentPane.add(new
contentPane.add(new
contentPane.add(new
contentPane.add(new
contentPane.add(new
JButton("Button 1"));
JButton("2"));
JButton("Button 3"));
JButton("Long-Named Button 4"));
JButton("Button 5"));
26
13
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Orientao por Eventos
27
Orientao por Eventos
Um modelo de programao que tornou-se
bastante difundido com o uso de interfaces
grficas foi a programao orientada por
eventos. Segundo esse modelo, o programa
deixa de ter o controle do fluxo de execuo,
que passa a um sistema encarregado de
gerenciar a interface. Assim, o programa
passa a ser chamado pelo sistema quando
algum evento gerado na interface.
28
14
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Mecanismos de Callback
Para que o programa possa ser chamado pelo
sistema, ele deve registrar uma funo para
cada evento de interface que ele desejar tratar.
Tais funes so chamadas de callbacks por
serem chamadas de volta pelo sistema.
29
Callbacks OO?
Esse modelo ortogonal ao modelo de
orientao por objetos. perfeitamente
possvel projetar um sistema OO que use o
modelo de orientao por eventos para tratar
eventos de interface, comunicaes, etc.
Porm, temos um problema: uma linguagem
puramente OO no possui o conceito de
funo. Como resolver ento?
30
15
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Objeto Callback
A soluo utilizar um objeto que faa o papel
de callback. Ou seja, onde registraramos uma
funo, passamos a registrar um objeto. Assim,
quando o sistema precisar executar a callback,
ele dever executar um determinado mtodo do
objeto. Esse mtodo, ento, far o tratamento
do evento.
31
Callbacks em Java
? Como
Java uma linguagem OO na qual
no existe o conceito de funo, callbacks
devem ser implementadas atravs de objetos
? Um objeto que implementa uma callback
em Java chamado de listener
32
16
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Listeners & Eventos
Os listeners fazem o papel das callbacks.
Listeners so definidos por interfaces e podem
estar aptos a tratar mais de um tipo de evento.
Quando um listener tem um de seus mtodos
chamados, ele recebe um parmetro que
descreve o evento ocorrido. Esse parmetro
um objeto: existem classes para modelar
diferentes grupos de eventos.
33
Listeners
? Definem interfaces
que representam um
grupo de callbacks
? So registrados junto aos componentes
? Exemplo: java.awt.event.MouseListener
public
public
public
public
public
abstract
abstract
abstract
abstract
abstract
void
void
void
void
void
mouseClicked(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
34
17
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
ActionListener
? Modela
a callback de um evento do tipo
ActionEvent.
public abstract void actionPerformed (ActionEvent e)
35
WindowListener
? Modela
a callback de um evento do tipo
WindowEvent. Essa interface declara um
mtodo para cada evento do grupo
public
public
public
public
public
public
public
abstract
abstract
abstract
abstract
abstract
abstract
abstract
void
void
void
void
void
void
void
windowOpened(WindowEvent e)
windowClosing(WindowEvent e)
windowClosed(WindowEvent e)
windowIconified(WindowEvent e)
windowDeiconified(WindowEvent e)
windowActivated(WindowEvent e)
windowDeactivated(WindowEvent e)
36
18
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Eventos
? Trazem
informaes sobre o evento ocorrido
? So passados aos listeners (callbacks)
? Exemplo: java.awt.event.MouseEvent
public int getX()
public int getY()
public int getClickCount()
37
ActionEvent
? Modela
o evento que representa uma
ao executada sobre um componente.
? O significado depende do componente.
? Exemplos:
boto pressionado
entrada de texto finalizada
38
19
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
WindowEvent
? Modela
os eventos que podem ocorrer em
uma janela. Essa classe declara constantes
que identificam os diversos eventos
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
WINDOW_OPENED
WINDOW_CLOSING
WINDOW_CLOSED
WINDOW_ICONIFIED
public static final int WINDOW_DEICONIFIED
public static final int WINDOW_ACTIVATED
public static final int WINDOW_DEACTIVATED
public Window getWindow()
39
Implementando um Listener
? Define
a classe que implementa a
interface do Listener
class MeuListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Boto pressionado");
}
}
40
20
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Registrando um Listener
? Cria
o objeto de callback e o registra no
componente
button.addActionListener(new MeuListener());
41
Implementando um Listener
de Janela
Para criarmos um listener para um evento de
janela devemos criar uma classe que implemente
a interface WindowListener. Nessa classe,
codificaremos, ento, o mtodo correspondente
ao evento que desejamos tratar. Porm, no
podemos implementar uma interface e deixar de
codificar algum mtodo. Assim, precisaremos
implementar todos os sete mtodos definidos.
42
21
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Implementando um Listener
de Janela
class MeuListener implements WindowListener {
public void windowOpened(WindowEvent e) { }
public void windowClosing(WindowEvent e) {
System.out.println("Janela sendo fechada");
}
public void windowClosed(WindowEvent e) { }
public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e){ }
public void windowActivated(WindowEvent e){ }
public void windowDeactivated(WindowEvent e) { }
}
43
Adaptadores
No caso anterior, seis implementaes seriam
vazias pois s desejvamos responder a um
nico evento. Como essa uma situao
comum, o pacote event define adaptadores
para todas as interfaces de listeners que tm
mais de um mtodo. Um adaptador uma
classe que implementa o listener e d
implementaes vazias para todos os
mtodos.
44
22
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
Adaptadores
class MeuListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.out.println("Janela sendo fechada");
}
}
45
Uso de local inner classes
? Classe
que implementa a interface pode ser:
aninhada dinamicamente
local ao mtodo que faz o registro do listener
annima
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Boto pressionado");
}
});
46
23
Java First-Tier: Aplicaes
Grupo de Linguagens de Programao - DI/PUC-Rio
import java.awt.event.*;
import javax.swing.*;
Exemplo I
public class Janela1 {
JButton botaoLimpa;
JTextField campoTexto;
JFrame janela;
public Janela1 () {
botaoLimpa = new JButton ("Limpa");
campoTexto = new JTextField(10);
janela = new JFrame ("Exemplo 1 de Listener");
janela.setSize(300,100);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
JPanel painel = new JPanel();;
painel.add (botaoLimpa); painel.add (campoTexto);
janela.getContentPane().add(painel);
botaoLimpa.addActionListener (new LimpaCampoListener(campoTexto));
janela.setVisible(true);
}
public static void main(String[] args) {
new Janela1();
}
}
class LimpaCampoListener implements ActionListener {
JTextField campo;
LimpaCampoListener(JTextField campo) {
this.campo = campo;
}
public void actionPerformed(ActionEvent e) {
campo. setText("");
}
}
import java.awt.event.*;
import javax.swing.*;
47
Exemplo II
public class Janela2 {
JButton botaoLimpa;
JTextField campoTexto;
JFrame janela;
private class LimpaCampoListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
campoTexto.setText("");
}
}
public Janela2() {
botaoLimpa = new JButton("Limpa");
campoTexto = new JTextField(10);
janela = new JFrame ("Exemplo 2 de Listener");
janela.setSize(300,100);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
JPanel painel = new JPanel();;
painel.add (botaoLimpa); painel.add (campoTexto);
janela.getContentPane().add(painel);
botaoLimpa.addActionListener (new LimpaCampoListener());
janela.setVisible(true);
}
public static void main(String[] args) {
new Janela2();
}
}
48
24
Java First-Tier: Aplicaes
import java.awt.event.*;
import javax.swing.*;
Grupo de Linguagens de Programao - DI/PUC-Rio
Exemplo III
public class Janela3 {
JButton botaoLimpa;
JTextField campoTexto;
JFrame janela;
public Janela3() {
botaoLimpa = new JButton("Limpa");
campoTexto = new JTextField(10);
janela = new JFrame ("Exemplo 3 de Listener");
janela.setSize(300,100);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
JPanel painel = new JPanel();;
painel.add (botaoLimpa); painel.add (campoTexto);
janela.getContentPane().add(painel);
botaoLimpa.addActionListener (new ActionListener () {
public void actionPerformed(ActionEvent e) {
campoTexto.setText("");
}
});
janela.setVisible(true);
}
public static void main(String[] args) {
new Janela3();
}
}
49
import java.awt.event.*;
import javax.swing.*;
Exemplo IV
public class Janela4 {
public Janela4() {
JButton botaoLimpa = new JButton("Limpa");
final JTextField campoTexto = new JTextField(10);
JFrame janela = new JFrame ("Exemplo 4 de Listener");
janela.setSize(300,100);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
JPanel painel = new JPanel();;
painel.add (botaoLimpa); painel.add (campoTexto);
janela.getContentPane().add(painel);
botaoLimpa.addActionListener (new ActionListener () {
public void actionPerformed(ActionEvent e) {
campoTexto.setText("");
}
});
janela.setVisible(true);
}
public static void main(String[] args) {
new Janela4();
}
}
50
25