Você está na página 1de 14

AULA TEÓRICA 7

Tema 4. Tratamento de eventos de mouse. Classe


adaptadora

1
1
Tratamento de eventos de mouse

Os eventos de mouse podem ser capturados por qualquer componente GUI que se
derive de java.awt.Component.

Alguns dos tipos de eventos mais comuns (inclusive de janela):


Inte rface Méto dos Chamada
MouseListener mousePressed(MouseEvent ev) Quando um botão do rato é pressionado
sobre um componente
mouseClicked(MouseEvent ev) Quando um botão do rato é pressionado e é
liberado
mouseEntered(MouseEvent ev) Quando o rato entra numa janela
mouseExited(MouseEvent ev) Quando o rato sai de uma janela
MouseMotionListener mouseDragged(MouseEvent ev) Quando o rato é deslocado com o botão
premido
mouseMoved(MouseEvent ev) Quando o rato é deslocado sem que o botão
esteja premido
WindowListener windowClosed() Quando a janela acabou de ser fechada
windowOpened() Quando a janela é aberta
WindowActivated() Quando a janela é activada
WindowDeActivated() Quando a janela é desactivada

2
Os métodos das interfaces MouseListener e MouseMotionListener são
resumidos no exemplo a seguir.

Cada um dos métodos de tratamento de eventos do mouse recebe um objecto


MouseEvent como argumento. O objecto MouseEvent contém as
informações sobre o evento que ocorreu, incluindo as coordenadas x e y da
posição em que o evento ocorreu.

A classe da aplicação implementa as duas interfaces de modo a poder esperar


seus próprios eventos de mouse. Observe que todos os sete métodos dessas
duas interfaces devem ser definidos pelo programador quando uma classe
implementa as duas interfaces.

3
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseTracker extends JFrame implements
MouseListener,MouseMotionListener
{ private JLabel statusBar;
public MouseTracker()
{ super("Demonstrating Mouse Events");
statusBar = new JLabel();
getContentPane().add(statusBar, BorderLayout.SOUTH);

addMouseListener(this);
addMouseMotionListener(this);
setSize(275, 100);
setVisible(true);
}
4
//implementação de métodos do MouseListener, processa o evento quando mouse
// é largado immediatamente apos de ser pressionado
public void mouseClicked(MouseEvent event )
{ statusBar.setText("Clicked at ["+event.getX()+", "+
event.getY()+"]" ); }

//processa o evento quando mouse é pressionado


public void mousePressed( MouseEvent event )
{ statusBar.setText( "Pressed at ["+event.getX()+", "+
event.getY()+"]"); }

//processa o evento quando mouse é largado apos de ser arrastado


public void mouseReleased(MouseEvent event )
{ statusBar.setText("Released at ["+event.getX()+", " +
event.getY() + "]" ); }
//processa o evento quando mouse entra em uma área
public void mouseEntered(MouseEvent event )
{ JOptionPane.showMessageDialog(null, "Mouse in window" ); }

//processa o evento quando mouse entra sai de uma área


public void mouseExited(MouseEvent event)
{ statusBar.setText("Mouse outside window"); }

5
// implementação de métodos do MouseMotionListener
//processa o evento quando mouse é arrastado com o botão pressionado
public void mouseDragged( MouseEvent event )
{ statusBar.setText("Dragged at [" +event.getX()+", "+
event.getY()+"]" ); }

//processa o evento quando mouse é movimentado


public void mouseMoved( MouseEvent event )
{ statusBar.setText("Moved at [" + event.getX()+", "+
event.getY()+"]"); }

public static void main(String args[] )


{ MouseTracker application = new MouseTracker();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
A caixa de diálogo de mensagem aparece quando o mouse se move para dentro da
janela.

6
Pop-up Menu (em resposta ao clique com botão direito)

The JPopupMenu Class

• Estes menus não estão ligados a um bara de menu;

• São menus livres que estão associados à um componente;

• Eles são activados por um evento pop-up trigger que ocorre quando o mouse está sobre o

componente .

• Em AWT e Swing, este trigger é tipicamente um evento do mouse. Uma vez activado, o

utlizador pode interagir com o menu normalmente.

Exemplo do método processMouseEvent() que activa um


pop-up menu depois de receber o trigger certo:

public void processMouseEvent(MouseEvent e) {


if (e.isPopupTrigger( ))
//if(SwingUtilities.isRightMouseButton(e))–para Mac OS
7
//popup.show(e.getComponent(), e.getX(), e.getY());
Classe Adapatadora

Nem sempre é desejável definir todos os métodos numa


interface listener do evento.

Por exemplo, o programa pode precisar apenas do gestor do


mouseClicked da interface WindowListener, que na realidade
especifica 7 métodos. Para muitas das interfaces listeners que
contêm múltiplos métodos, os pacotes java.awt.event e
javax.swing.event fornecem classes adaptadoras de listeners
de eventos.

Uma classe adaptadora implementa uma interface e fornece


uma implementação default (com o corpo de método vazio) de
cada método na interface.

As classes adaptadoras de eventos e as interfaces que elas


8
implementam:
As classes adaptadoras de eventos e as interfaces que elas
implementam:
ComponentAdapter ComponentListener
ContainerAdapter ContainerListener
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener
 
O programador pode estender a classe adaptadora para herdar a
implementação default de cada método e depois sobrescrever
o(s) método(s) necessário(s) para o tratamento de eventos.

9
Quando uma classe implementa uma interface, todas as
subclasses directas e indirectas daquela classe herdam este
relacionamento.

Portanto, um objecto de uma classe que estende uma classe


adaptadora de evento é um objecto do tipo listener de evento
correspondente (por exemplo, um objecto de uma subclasse de
MouseAdapter é um MouseListener).

No exemplo a seguir o utilizador pode desenhar figuras com o


mouse, arrastando-o sobre o fundo da janela. Esse exemplo
não utiliza o método mouseMoved, de modo que
MouseMotionListener é definido como uma subclasse de
MouseMotionAdapter. Essa classe já define mouseMoved e
mouseDragged, de modo que simplesmente foi sobrescrito
mouseDragged para fornecer a funcionalidade de desenho.
10
11
import java.awt.*; import java.awt.event.*;
import javax.swing.*;
public class Painter extends JFrame
{ private int xValue = -10, yValue = -10;
public Painter()
{ super("A simple paint program");
//create a label and place it in SOUTH of BorderLayout
getContentPane().add(new Label("Drag the mouse to draw"),
BorderLayout.SOUTH);
addMouseMotionListener( // anonymous inner class
new MouseMotionAdapter()
{ // store drag coordinates and repaint
public void mouseDragged(MouseEvent event)
{ xValue = event.getX();
yValue = event.getY();
repaint();
}} // end anonymous inner class
); // end call to addMouseMotionListener
setSize(300, 150);
setVisible(true);
12
}
 
//desenha oval (metodo fillOval) dentro de 4 x 4 pixel num local específico da
//janela
public void paint(Graphics g)
{ g.fillOval(xValue, yValue, 4, 4);
}

public static void main(String[] args)


{ Painter x = new Painter();
x.addWindowListener(// classe adaptadora
new WindowAdapter()
{ public void windowClosing(WindowEvent ev)
{ System.exit(0); }
} // end anonymous inner class
); // end call to addWindowListener
}
}
As variáveis xValue e yValue inicialmente são configuradas fora
da área da janela para evitar que uma elipse seja desenhada na
área de fundo na 1a chamada a paint quando janela é exibida.
13
Referência bibliográfica:
António José Mendes; Maria José Marcelino.
“Fundamentos de programação em Java 2”. FCA. 2002.
Elliot Koffman; Ursula Wolz.
“Problem Solving with Java”. 1999.
F. Mário Martins;
“Programação Orientada aos objectos em Java 2”, FCA, 2000,
John Lewis, William Loftus;
“Java Software Solutions: foundation of program design”, 2nd edition, Addision-Wesley

John R. Hubbard.
“Theory and problems of programming with Java”. Schaum’s Outline series. McGraw-Hill.
H. Deitel; P. Deitel.
“Java, como programar”. 4 edição. 2003. Bookman.
Rui Rossi dos Santos.
“Programando em Java 2– Teoria e aplicações”. Axcel Books. 2004

14

Você também pode gostar