tratamento eventos

48
Prof. Ms. André Marcelo Farina Manipulação de Eventos 01-Abr-2013

Upload: clavenegas

Post on 26-May-2015

839 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Tratamento eventos

Prof. Ms. André Marcelo Farina

Manipulação

de Eventos

01-Abr-2013

Page 2: Tratamento eventos

Manipulação de Eventos

• A monitoração do que está ocorrendo em uma interface gráfica é feita através de eventos;

• Na manipulação de eventos, temos dois extremos: – o originador (interface gráfica) e;

– o ouvinte (quem trata) dos eventos;

• Para uma classe ser ouvinte é preciso que a mesma implemente uma interface Listener (Ouvinte) e depois que seja registrada por uma classe originadora.

Page 3: Tratamento eventos

• Em Java um evento é um objeto do tipo

– java.util.EventObject ou um subtipo

como

– ActionEvent ou

– WindowEvent;

• Origens diferentes de eventos podem

produzir eventos diferentes.

Manipulação de Eventos

Page 4: Tratamento eventos

Visão geral da manipulação de eventos:

1. Ouvinte implementa uma interface ouvinte;

2. Origem de evento registra objetos ouvintes;

3. Origem de evento envia objetos eventos

para todos os ouvintes registrados;

4. Os objetos ouvintes utilizam a informação

do objeto evento para determinar sua

reação.

Manipulação de Eventos

Page 5: Tratamento eventos

Manipulação de Eventos

OuvinteOriginador

Registra

Ouvintes

EventObject

Reage ao

Evento

Interface Ouvinte

Um componente,

um botão por ex.

Um objeto ouvinte, um

ActionListener, por ex.

Um objeto Evento

Page 6: Tratamento eventos

Manipulação de Eventos

Diagrama esquemático

Page 7: Tratamento eventos

• O objeto ouvinte é registrado no objeto origem com o seguinte código :

objetoEventoOrigem.addEventListener(objetoOuvinte)

• Por exemplo:

public class Ouvinte implements ActionListener{

public void actionPerformed(ActionEvent evt){

//ação

}

}

Ouvinte acao = new Ouvinte();

JButton botao = new JButton(“Limpar”);

botao.addActionListener(acao);

Manipulação de Eventos

Page 8: Tratamento eventos

• A classe do objeto ouvinte deve implementar a

interface ouvinte apropriada (ex.:

ActionListener);

• Para implementar (CONTRATO) a interface

ActionListener, a classe ouvinte precisa ter

um método (actionPerformed) que recebe o

evento ActionEvent.

Manipulação de Eventos

Page 9: Tratamento eventos

class Ouvinte implements ActionListener {

public void actionPerformed(ActionEvent evt){

//a reação ao clique do botão

}

}

Manipulação de Eventos

Page 10: Tratamento eventos

• Um botão é um objeto do tipo JButton;

JButton yellowButton = new JButton(“Yellow”);

• Para se adicionar um botão a um painel,

usamos o método add() do painel;

Criando Botões

Page 11: Tratamento eventos

//Painel que possui botões e é ouvinte de ação

public class MyPanel extends JPanel

implements ActionListener {

private JButton yellowBtn = new JButton("Yellow");

private JButton blueBtn = new JButton("Blue");

private JButton redBtn = new JButton("Red");

public MyPanel() {

this.add(yellowBtn);

this.add(blueBtn);

this.add(redBtn);

}

}

Criando e adicionando botões

Page 12: Tratamento eventos

//Janela que possui o painel criado anteriomente

public class FirstFrame extends JFrame {

public FirstFrame() {

setTitle("FirstFrame");

setSize(300, 200);

setDefaultCloseOperation(

EXIT_ON_CLOSE);

add(new MyPanel());

}

public static void main(String[] args) {

JFrame frame = new FirstFrame();

frame.setVisible(true);

}

}

Criando e adicionando botões

Page 13: Tratamento eventos

Resultado

Resultado da janela (JFrame) com o painel (JPanel) que

contém botões e é ouvinte de ação

Page 14: Tratamento eventos

• Após adicionar os botões é necessário tratar

os eventos dos mesmos;

• Isto requer a implementação da interface

ActionListener

– implementação do método actionPerformed;

• Para verificar em qual origem o evento

ocorreu, podemos usar o método

getSource;

Tratando os eventos

Page 15: Tratamento eventos

public void actionPerformed(ActionEvent evt) {

Object source = evt.getSource();

if(source == yellowBtn) {

//trata evento

} else if(source == blueBtn) {

//trata evento

} else if(source == redBtn) {

//trata evento

}

}

Tratando os eventos

Page 16: Tratamento eventos

class MyPanel extends JPanel implements ActionListener {

public void actionPerformed(ActionEvent evt) {

Object source = evt.getSource();

if(source == yellowBtn) {

setBackground(Color.YELLOW);

} else if(source == blueBtn) {

setBackground(Color.BLUE);

} else if(source == redBtn) {

setBackground(Color.RED);

}

}

...

}

Tratando os eventos

Page 17: Tratamento eventos

public class MyPanel extends JPanel implements ActionListener {

private JButton yellowButton = new JButton("Yellow"); private JButton blueButton = new JButton("Blue"); private JButton redButton = new JButton("Red"); public MyPanel() { this.add(yellowButton); this.add(blueButton); this.add(redButton); yellowButton.addActionListener(this); blueButton.addActionListener(this); redButton.addActionListener(this); } }

Registrando os Ouvintes

Page 18: Tratamento eventos

• Quando um usuário tenta fechar uma

janela, um evento WindowEvent é

gerado pela classe Jframe;

• Assim, é possível se construir um ouvinte

de janela (WindowListener) para se

determinar o que fazer quando uma janela

é fechada.

Captura de Eventos de Janelas

Page 19: Tratamento eventos

public class AcaoFechar implements WindowListener{

....

}

public class FirstFrame extends JFrame {

public FirstFrame() {

this.addWindowListener(new AcaoFechar());

}

...

}

Captura de Eventos de Janelas

Page 20: Tratamento eventos

• A classe ouvinte AcaoFechar precisa implementar a interface WindowListener;

• A interface WindowListener define os seguintes métodos: – public void windowActivated(WindowEvent e)

– public void windowClosed(WindowEvent e)

– public void windowClosing(WindowEvent e)

– public void windowOpened(WindowEvent e)

– ...

Captura de Eventos de Janelas

Page 21: Tratamento eventos

• Assim, como WindowListerner é uma interface, todos os métodos devem ser implementados;

• Se estivermos interessados em somente um método (p.ex. windowClosing()), todos os outros devem ser implementados com corpo vazio.

Captura de Eventos de Janelas

Page 22: Tratamento eventos

class AcaoFechar implements WindowListener {

public void windowActivated(WindowEvent e) {}

public void windowClosed(WindowEvent e) {}

public void windowOpened(WindowEvent e) {}

public void windowIconified(WindowEvent e) {}

....

public void windowClosing(WindowEvent e) {

System.exit(0);

}

}

Captura de Eventos de Janelas

Page 23: Tratamento eventos

• Para se evitar isso, Java oferece as classes adaptadoras, que já implementam tais métodos com corpo vazio;

• Dessa forma, ao invés de se implementar uma interface ouvinte pode-se estender uma classe adaptadora;

• Para o controle de Janela, a classe adaptadora é chamada WindowAdapter.

Classes Adaptadoras

Page 24: Tratamento eventos

class AcaoFechar extends WindowAdapter {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

}

Classes Adaptadoras

Page 25: Tratamento eventos

• Uma lista de tipos de eventos AWT destinados a ouvintes: –ActionEvent; –AdjustmentEvent; –ComponentEvent; –ContainerEvent; –FocusEvent; – ItemEvent; –KeyEvent; –MouseEvent; –TextEvent; –WindowEvent.

A Hierarquia de Eventos AWT

Page 26: Tratamento eventos

• Existem onze interfaces ouvintes para esses eventos:

– ActionEvent -> ActionListener;

– AdjustmentEvent -> AdjustmentListener

– ComponentEvent -> ComponentListener

– ContainerEvent -> ContainerListener

– FocusEvent -> FocusListener

– ItemEvent ->ItemListener

– KeyEvent -> KeyListener

– MouseEvent -> MouseListener e

MouseMotionListener;

– TextEvent -> TextListener

– WindowEvent -> WindowListener

A Hierarquia de Eventos AWT

Page 27: Tratamento eventos

• Dessas interfaces (especificamente aquelas que têm mais de um método), sete vêem junto com classes adaptadoras:

– ComponentListener -> ComponentAdapter

– ContainerListener -> ContainerAdapter

– FocusListener -> FocusAdapter

– KeyListener -> KeyAdapter

– MouseListener -> MouseAdapter

– MouseMotionListener -> MouseMotionAdapter

– WindowListener -> WindowAdapter

A Hierarquia de Eventos AWT

Page 28: Tratamento eventos

• Na linguagem Java, um componente tem o foco se puder receber pressionamentos de teclas;

• Somente um componente pode ter o foco de cada vez;

• Um componente pode ganhar o foco se o usuário clicar o mouse dentro dele, ou quando o usuário usa a tecla <TAB> para trocar de componente;

• A priori, os componentes são percorridos da esquerda para a direita e de cima para baixo quando o <TAB> é pressionado.

Eventos de Foco

Page 29: Tratamento eventos

• Por fim, pode-se usar o método

requestFocus() para mover o foco até

qualquer componente visível em tempo de

execução;

• Um ouvinte de foco precisa implementar dois

métodos: focusGained() e focusLost().

Esses métodos são acionados quando a

origem do evento ganhar ou perder o foco.

Eventos de Foco

Page 30: Tratamento eventos

public class MyPanel extends JPanel {

private JButton yellowButton = new JButton("Yellow");

private JButton blueButton = new JButton("Blue");

private JButton redButton = new JButton("Red");

public MyPanel() {

this.add(yellowButton);

this.add(blueButton);

this.add(redButton);

yellowButton.addFocusListener(new OuvinteBotao());

blueButton.addFocusListener(new OuvinteBotao());

redButton.addFocusListener(new OuvinteBotao());

}

}

Eventos de Foco

Page 31: Tratamento eventos

public class MyPanel extends JPanel {

//Classe interna ouvinte de foco class OuvinteBotao extends FocusAdapter {

public void focusGained(FocusEvent e) {

Object source = evt.getSource();

if(source == yellowButton) {

setBackground(Color.YELLOW);

} else if(source == blueButton) {

setBackground(Color.BLUE);

} else if(source == redButton) {

setBackground(Color.RED);

}

}

}

}

Eventos de Foco

Page 32: Tratamento eventos

public class FirstFrame extends JFrame {

public FirstFrame() {

setTitle("FirstFrame");

setSize(300, 200);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.getContentPane().add(new MyPanel());

}

public static void main(String[] args) {

JFrame frame = new FirstFrame();

frame.setVisible(true);

}

}

Eventos de Foco

Page 33: Tratamento eventos

• Como já foi visto, é possível ser notificado sempre que uma janela: – Foi aberta;

– Foi fechada;

– Tornou-se ativa;

– Tornou-se inativa;

– Foi minimizada;

– Foi restaurada, voltando ao tamanho original;

– Está tentando ser fechada pelo usuário.

Eventos de Janela

Page 34: Tratamento eventos

• Quando uma tecla é pressionada um evento KeyEvent.KEY_PRESSED é gerado;

• Quando a mesma é solta, um evento KeyEvent.KEY_RELEASE é gerado;

• Esses eventos são capturados pelos métodos keyPressed() e KeyReleased() de qualquer classe que implemente a interface KeyListener.

Eventos de Teclado

Page 35: Tratamento eventos

• Usando a classe adaptadora KeyAdapter não é necessário implementar todos os métodos de tratamento de teclado;

• Para se trabalhar com esses métodos, primeiro

deve-se verificar o código da tecla com o método getKeyCode();

• Para identificar teclas, Java usa a seguinte

nomenclatura: – VK_A ... VK_Z; – VK_0 ... VK_9; – VK_COMMA, VK_ENTER...; – Etc;

Eventos de Teclado

Page 36: Tratamento eventos

public class MyPanel extends JPanel {

....

class OuvinteTeclado extends KeyAdapter{

public void keyPressed(KeyEvent evt){

if(evt.getKeyCode() == KeyEvent.VK_ENTER){

...

}

}

}

}

Eventos de Teclado - Código

Page 37: Tratamento eventos

• Para saber se as teclas shift, alt,

ctrl ou meta (Alt ou Win) estão

pressionadas, é possível empregar os

seguintes métodos:

– isShiftDown();

– isAltDown();

– isCrtlDown();

– isMetaDown();

Eventos de Teclado

Page 38: Tratamento eventos

• Não é necessário processar

explicitamente os eventos do mouse caso

só seja necessário verificar se um usuário

clicou em um botão;

• Essas operações são processadas

internamente e convertidas em eventos

semânticos apropriados;

• Por exemplo, pode-se reagir a esses

eventos com um método

actionPerformed().

Eventos de Mouse

Page 39: Tratamento eventos

• Contudo é possível capturar os eventos de movimentação de um mouse;

• Quando um cliente clica em um botão de um mouse três métodos ouvintes são chamados: mousePressed(), mouseReleased() e mouseClicked();

• A seção Eventos de Mouse do livro Core Java 2 Volume I (pág. 305-313) apresenta mais detalhes sobre os eventos de mouse.

Eventos de Mouse

Page 40: Tratamento eventos

• Até agora implementamos várias origens de eventos informando um único ouvinte de eventos;

• É possível fazer o oposto: um evento único pode ser enviado para mais de um objeto ouvinte. Isto é chamado de multidifusão;

• A multidifusão é útil quando um evento desperta o interesse potencial de muitas partes;

• Para isso basta adicionar vários ouvintes a uma única origem de eventos.

Multidifusão (Multicast)

Page 41: Tratamento eventos

Multidifusão (Multicast)

Page 42: Tratamento eventos

public class SimpleFrame extends JFrame

implements ActionListener {

public void actionPerformed(ActionEvent e) {

dispose();

}

}

Multidifusão (Multicast)

Page 43: Tratamento eventos

public class MulticastPanel extends JPanel

implements ActionListener {

private JButton closeAllButton= new JButton("Close all");

private JButton newButton= new JButton("New");

public MulticastPanel() {

this.add(newButton);

this.add(closeAllButton);

newButton.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {

SimpleFrame f = new SimpleFrame();

f.setTitle(“Multicast Window ");

f.setSize(200, 150);

f.setVisible(true);

closeAllButton.addActionListener(f);

}

}

Multidifusão (Multicast)

Page 44: Tratamento eventos

public class MulticastFrame extends JFrame {

public MulticastFrame() {

setTitle("MulticastTest");

setSize(300,200);

setDefaultCloseOperation(EXIT_ON_CLOSE);

add(new MulticastPanel());

}

}

Multidifusão (Multicast)

Page 45: Tratamento eventos

public class Programa {

public static void main(String[] args) {

MulticastFrame frame =

new MulticastFrame();

frame.setVisible(true);

}

}

Multidifusão (Multicast)

Page 46: Tratamento eventos

• Existem três possíveis estilos visuais de

apresentação em Java: – Motif: com.sun.java.swing.plaf.motif.MotifLookAndFeel

– Windows: com.sun.java.swing.plaf.windows.WindowsLookAndFeel

– Metal: javax.swing.plaf.metal.MetalLookAndFeel

• O estilo windows só esta presente para o

sistema operacional Microsoft Windows, e

por padrão o estilo usado é o metal.

Alterando o Estilo Visual

Page 47: Tratamento eventos

public class FirstFrame extends JFrame {

public FirstFrame() {

setTitle("FirstFrame");

setSize(300, 200);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.getContentPane().add(new MyPanel());

try {

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf. motif.MotifLookAndFeel"

);

SwingUtilities.updateComponentTreeUI(

this.getContentPane() );

} catch(Exception e) { }

}

}

Alterando o Estilo Visual

Page 48: Tratamento eventos

• Altere o último exemplo (multicast) para o seguinte:

– Conter um combobox com 3 opções de formas

geométricas

– Ao criar um novo frame que este desenhe a forma

escolhida no combo

– Alterar o look and feel para Windows (ou Motif para

Linux)

Atividades