SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Manipulação
de Eventos
  Prof. Ms. André Marcelo Farina




             01-Abr-2013
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.
Manipulação de 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

    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


                                        Interface Ouvinte
            R i ta
            es
             g r
            O i ts
             un
             v e


                       Eet b c
                        vn j t
                          Oe
     Og ao
      r i dr
       i n                                  Oit
                                            un
                                             v e

                     Um objeto Evento
                                        R ga
                                         e eo
                                          a
Um componente,                          Eet
                                         vn o
um botão por ex.
                                  Um objeto ouvinte, um
                                  ActionListener, por ex.
Manipulação de Eventos
  Diagrama esquemático
Manipulação de 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

• 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


class Ouvinte implements ActionListener {

    public void actionPerformed(ActionEvent evt){
     //a reação ao clique do botão

    }

}
Criando Botões


• 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 e adicionando botões
//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
//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);
    }
}
Resultado




Resultado da janela (JFrame) com o painel (JPanel) que
contém botões e é ouvinte de ação
Tratando os 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

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
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);
           }
      }
...
}
Registrando os Ouvintes
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);
    }

}
Captura de Eventos de Janelas

• 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

public class AcaoFechar implements WindowListener{
   ....
}

public class FirstFrame extends JFrame {

    public FirstFrame() {
        this.addWindowListener(new AcaoFechar());
    }

    ...
}
Captura de Eventos de Janelas

• 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


• 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

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

}
Classes Adaptadoras

• 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

class AcaoFechar extends WindowAdapter {


    public void windowClosing(WindowEvent e) {
       System.exit(0);
    }


}
A Hierarquia de Eventos AWT
• 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
• 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
• 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
Eventos de Foco

• 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

• 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
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
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
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 Janela

• 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 Teclado
• 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
• 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 - Código
public class MyPanel extends JPanel {

    ....
    class OuvinteTeclado extends KeyAdapter{
         public void keyPressed(KeyEvent evt){
             if(evt.getKeyCode() == KeyEvent.VK_ENTER){
                  ...
             }
         }
     }

}
Eventos de Teclado

• 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 Mouse

• 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

• 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.
Multidifusão (Multicast)
• 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)
Multidifusão (Multicast)

public class SimpleFrame extends JFrame
                     implements ActionListener {


    public void actionPerformed(ActionEvent e) {
        dispose();
    }


}
Multidifusão (Multicast)
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)

public class MulticastFrame extends JFrame {

    public MulticastFrame() {
        setTitle("MulticastTest");
        setSize(300,200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(new MulticastPanel());
    }
}
Multidifusão (Multicast)


public class Programa {

    public static void main(String[] args) {
        MulticastFrame frame =
                       new MulticastFrame();
         frame.setVisible(true);
    }
}
Alterando o Estilo Visual

• 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
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)   { }
     }
}
Atividades
• 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)

Contenu connexe

Tendances (20)

Java10
Java10Java10
Java10
 
Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3Capitulo 14 -_componentes_gui_parte_3
Capitulo 14 -_componentes_gui_parte_3
 
Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1Capitulo 14 -_componentes_gui_parte_1
Capitulo 14 -_componentes_gui_parte_1
 
Java AWT
Java AWTJava AWT
Java AWT
 
Interfaces Gráficas em Java Parte 2
Interfaces Gráficas em Java Parte 2Interfaces Gráficas em Java Parte 2
Interfaces Gráficas em Java Parte 2
 
Interfaces Gráficas em Java Parte 1
Interfaces Gráficas em Java Parte 1Interfaces Gráficas em Java Parte 1
Interfaces Gráficas em Java Parte 1
 
Java12
Java12Java12
Java12
 
Java swingcomponentes
Java swingcomponentesJava swingcomponentes
Java swingcomponentes
 
Java14
Java14Java14
Java14
 
CURSO JAVA 02
CURSO JAVA 02CURSO JAVA 02
CURSO JAVA 02
 
Java introdução ao eclipse
Java   introdução ao eclipseJava   introdução ao eclipse
Java introdução ao eclipse
 
Java swing
Java swingJava swing
Java swing
 
Introdução ao Android (minicurso 4h)
Introdução ao Android (minicurso 4h)Introdução ao Android (minicurso 4h)
Introdução ao Android (minicurso 4h)
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)
 
IHC - Java Interface com o Usuário (Parte 1)
IHC - Java Interface com o Usuário (Parte 1)IHC - Java Interface com o Usuário (Parte 1)
IHC - Java Interface com o Usuário (Parte 1)
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dados
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Java11
Java11Java11
Java11
 
Interfaces Gráficas em Java Parte 3
Interfaces Gráficas em Java Parte 3Interfaces Gráficas em Java Parte 3
Interfaces Gráficas em Java Parte 3
 
Exercicios - Java Swing
Exercicios - Java SwingExercicios - Java Swing
Exercicios - Java Swing
 

Similaire à Tratamento eventos

Desenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidDesenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidEric Cavalcanti
 
Java - Gestão de componentes curso profissional
Java - Gestão de componentes curso profissionalJava - Gestão de componentes curso profissional
Java - Gestão de componentes curso profissionala41172
 
Interfacestangiveiscomputacaovisual
InterfacestangiveiscomputacaovisualInterfacestangiveiscomputacaovisual
InterfacestangiveiscomputacaovisualCampus Party Brasil
 
Aula 15 e 16 - Navegação - Activities e Fragments.pptx.pdf
Aula 15 e 16 - Navegação - Activities e Fragments.pptx.pdfAula 15 e 16 - Navegação - Activities e Fragments.pptx.pdf
Aula 15 e 16 - Navegação - Activities e Fragments.pptx.pdfnosbisantos
 
Applets e Java web start
Applets e Java web startApplets e Java web start
Applets e Java web startArtur Rodrigues
 
Atividades e Intenções (Android)
Atividades e Intenções (Android)Atividades e Intenções (Android)
Atividades e Intenções (Android)Natanael Fonseca
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015talkitbr
 
Android app communication
Android app communicationAndroid app communication
Android app communicationEloi Júnior
 
Programação reativa com RxJava
Programação reativa com RxJavaProgramação reativa com RxJava
Programação reativa com RxJavaMateus Parente
 
Desenvolvendo Interfaces Ricas em JavaFX para Ultrabooks
Desenvolvendo Interfaces Ricas em JavaFX para UltrabooksDesenvolvendo Interfaces Ricas em JavaFX para Ultrabooks
Desenvolvendo Interfaces Ricas em JavaFX para UltrabooksIntel Software Brasil
 
Curso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos ChavesCurso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos ChavesRonildo Oliveira
 

Similaire à Tratamento eventos (17)

GUI - Eventos
GUI - EventosGUI - Eventos
GUI - Eventos
 
Desenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidDesenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para Android
 
Interface grafica
Interface graficaInterface grafica
Interface grafica
 
Java script aula 07 - eventos
Java script   aula 07 - eventosJava script   aula 07 - eventos
Java script aula 07 - eventos
 
Bloco 5.3
Bloco 5.3Bloco 5.3
Bloco 5.3
 
Java - Gestão de componentes curso profissional
Java - Gestão de componentes curso profissionalJava - Gestão de componentes curso profissional
Java - Gestão de componentes curso profissional
 
Interfacestangiveiscomputacaovisual
InterfacestangiveiscomputacaovisualInterfacestangiveiscomputacaovisual
Interfacestangiveiscomputacaovisual
 
Aula 15 e 16 - Navegação - Activities e Fragments.pptx.pdf
Aula 15 e 16 - Navegação - Activities e Fragments.pptx.pdfAula 15 e 16 - Navegação - Activities e Fragments.pptx.pdf
Aula 15 e 16 - Navegação - Activities e Fragments.pptx.pdf
 
Applets e Java web start
Applets e Java web startApplets e Java web start
Applets e Java web start
 
Atividades e Intenções (Android)
Atividades e Intenções (Android)Atividades e Intenções (Android)
Atividades e Intenções (Android)
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015
 
Android app communication
Android app communicationAndroid app communication
Android app communication
 
Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)
 
Programação reativa com RxJava
Programação reativa com RxJavaProgramação reativa com RxJava
Programação reativa com RxJava
 
Desenvolvendo Interfaces Ricas em JavaFX para Ultrabooks
Desenvolvendo Interfaces Ricas em JavaFX para UltrabooksDesenvolvendo Interfaces Ricas em JavaFX para Ultrabooks
Desenvolvendo Interfaces Ricas em JavaFX para Ultrabooks
 
Curso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos ChavesCurso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos Chaves
 
Cap9
Cap9Cap9
Cap9
 

Tratamento eventos

  • 1. Manipulação de Eventos Prof. Ms. André Marcelo Farina 01-Abr-2013
  • 2. 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.
  • 3. Manipulação de 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.
  • 4. Manipulação de 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.
  • 5. Manipulação de Eventos Interface Ouvinte R i ta es g r O i ts un v e Eet b c vn j t Oe Og ao r i dr i n Oit un v e Um objeto Evento R ga e eo a Um componente, Eet vn o um botão por ex. Um objeto ouvinte, um ActionListener, por ex.
  • 6. Manipulação de Eventos Diagrama esquemático
  • 7. Manipulação de 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);
  • 8. Manipulação de 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.
  • 9. Manipulação de Eventos class Ouvinte implements ActionListener { public void actionPerformed(ActionEvent evt){ //a reação ao clique do botão } }
  • 10. Criando Botões • 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;
  • 11. Criando e adicionando botões //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); } }
  • 12. Criando e adicionando botões //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); } }
  • 13. Resultado Resultado da janela (JFrame) com o painel (JPanel) que contém botões e é ouvinte de ação
  • 14. Tratando os 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;
  • 15. Tratando os 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 } }
  • 16. Tratando os 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); } } ... }
  • 17. Registrando os Ouvintes 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); } }
  • 18. Captura de Eventos de Janelas • 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.
  • 19. Captura de Eventos de Janelas public class AcaoFechar implements WindowListener{ .... } public class FirstFrame extends JFrame { public FirstFrame() { this.addWindowListener(new AcaoFechar()); } ... }
  • 20. Captura de Eventos de Janelas • 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) – ...
  • 21. Captura de Eventos de Janelas • 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.
  • 22. Captura de Eventos de Janelas 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); } }
  • 23. Classes Adaptadoras • 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.
  • 24. Classes Adaptadoras class AcaoFechar extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
  • 25. A Hierarquia de Eventos AWT • Uma lista de tipos de eventos AWT destinados a ouvintes: – ActionEvent; – AdjustmentEvent; – ComponentEvent; – ContainerEvent; – FocusEvent; – ItemEvent; – KeyEvent; – MouseEvent; – TextEvent; – WindowEvent.
  • 26. A Hierarquia de Eventos AWT • 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
  • 27. A Hierarquia de Eventos AWT • 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
  • 28. Eventos de Foco • 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.
  • 29. Eventos de Foco • 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.
  • 30. Eventos de Foco 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()); } }
  • 31. Eventos de Foco 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); } } } }
  • 32. Eventos de Foco 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); } }
  • 33. Eventos de Janela • 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.
  • 34. Eventos de Teclado • 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.
  • 35. Eventos de Teclado • 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;
  • 36. Eventos de Teclado - Código public class MyPanel extends JPanel { .... class OuvinteTeclado extends KeyAdapter{ public void keyPressed(KeyEvent evt){ if(evt.getKeyCode() == KeyEvent.VK_ENTER){ ... } } } }
  • 37. Eventos de Teclado • 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();
  • 38. Eventos de Mouse • 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().
  • 39. Eventos de Mouse • 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.
  • 40. Multidifusão (Multicast) • 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.
  • 42. Multidifusão (Multicast) public class SimpleFrame extends JFrame implements ActionListener { public void actionPerformed(ActionEvent e) { dispose(); } }
  • 43. Multidifusão (Multicast) 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); } }
  • 44. Multidifusão (Multicast) public class MulticastFrame extends JFrame { public MulticastFrame() { setTitle("MulticastTest"); setSize(300,200); setDefaultCloseOperation(EXIT_ON_CLOSE); add(new MulticastPanel()); } }
  • 45. Multidifusão (Multicast) public class Programa { public static void main(String[] args) { MulticastFrame frame = new MulticastFrame(); frame.setVisible(true); } }
  • 46. Alterando o Estilo Visual • 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.
  • 47. Alterando o Estilo Visual 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) { } } }
  • 48. Atividades • 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)