Evenimente de mouse

Evenimentele de mouse sunt instanțe ale clasei java.awt.event.MouseEvent și sunt generate de către orice componentă a interfeței grafice, atunci când asupra ei se acționeaza cu mouse-ul.  Clasa MouseEvent este derivată din clasa java.awt.event.InputEvent. Evenimentele de mouse sunt intrarea cursorului de mouse într-o componentă sau ieșirea din aceasta, apăsarea unui buton de mouse sau eliberarea lui, efectuarea unui click de mouse (simplu sau multiplu) pe suprafața componentei, mișcarea mouse-ului.

Pentru ascultarea evenimentelor de mouse se folosesc interfețele java.awt.event.MouseListener,java.awt.event.MouseMotionListener și javax.swing.event.MouseInputListener. Ascultătoarele de mouse se pot obține, de asemenea, prin extinderea claselor java.awt.event.MouseAdapter,java.awt.event.MouseMotionAdapter și javax.swing.event.MouseInputAdapter.
 
În AWT se face distincție între evenimentele de mouse discrete și evenimentele care caracterizează mișcarea continuă a mouse-lui.
    a/ Evenimente de mouse
        - a fost apăsat un buton al mouse-ului (MOUSE_PRESSED);
        - a fost eliberat un buton al mouse-ului (MOUSE_RELEASED);
        - s-a făcut click de mouse, adică un buton al acestuia a fost apăsat și eliberat imediat (MOUSE_CLICKED);
        - cursorul mouse-ului a intrat într-o componentă (MOUSE_ENTERED);
        - cursorul mouse-ului a ieșit din componentă (MOUSE_EXITED).
Ascultarea acestor evenimente se face cu instanțe ale claselor care implementeaza interfața java.awt.event.MouseListener.
    b/ Evenimente de mișcare a mouse-ului
        - mouse-ul s-a mișcat pe suprafața componentei (MOUSE_MOVED);
        - mouse-ul a fost "tras" pe suprafața componentei, adică a fost mișcat ținând un buton apăsat (MOUSE_DRAGGED).
Aceste evenimente sunt ascultate cu instanțe ale claselor care implementează interfața java.awt.event.MouseMotionListener.

În JFC/Swing s-a introdus în plus interfața javax.swing.event.MouseInputListener, care ascultă ambele categorii de evenimente de mouse, moștenind cele două interfețe menționate mai sus.


 
Exemplu
În fișierul EvMouse.java este dat un exemplu de aplicație în care se ascultă evenimentele de mouse generate de o instanță a clasei JFrame și se afișează la terminal conținutul acestor evenimente. În acest scop, în clasa imbricată AMouse au fost implementate toate metodele interfeței MouseListener, dar aceste metode nu fac altceva, decât să afișeze la terminal evenimentul recepționat.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class EvMouse {
  static JFrame iug;  // referinta la fereastra
  static AF af; // referinta la ascultator de fereastra
  static AMouse am; // referinta la ascultator de mouse

  /* Clasa imbricata pentru ascultatorul de fereastra */ 
  static class AF extends WindowAdapter {
   public void windowClosing(WindowEvent e) {
    System.exit(0); // incheierea executarii aplicatiei
   }
  }

  /* Clasa imbricata pentru ascultatorul de mouse */
  static class AMouse implements MouseListener {
   public void mouseClicked(MouseEvent e) {
    System.out.println(e);
   }
   public void mousePressed(MouseEvent e) {
    System.out.println(e);
   }
   public void mouseReleased(MouseEvent e) {
    System.out.println(e);
   }
   public void mouseEntered(MouseEvent e) { 
    System.out.println(e);
   }
   public void mouseExited(MouseEvent e) { 
    System.out.println(e);
   }
  }

  /* Metoda principala */
  public static void main(String args[]) throws Exception {
    af=new AF(); // instantierea ascultatorului
    am=new AMouse(); // instantierea ascultatorului de mouse
    iug=new JFrame("Urmarire evenimente de mouse");
    iug.setSize(300,100);
    iug.setLocation(new Point(100,50));
    iug.setVisible(true);
    iug.addWindowListener(af); // adaugarea ascultatorului de fereastra
    iug.addMouseListener(am); // adaugarea ascultatorului de mouse
  }
}

Executând acest program, putem urmări pe ecran succesiunea de evenimente care se produc atunci când acționăm cu mouse-ul asupra ferestrei aplicației.
 
Evenimentul de mouse conține următoarele informații:
   - tipul evenimentului (câmpul id);
   - coordonatele punctului în care s-a produs evenimentul;
   - modul în care s-a produs evenimentul, caracterizat printr-un numar întreg, în care fiecare bit are o anumită semnificație. Acest număr poate fi decodificat cu ajutorul măștilor existente în clasa java.awt.event.InputEvent;
   - contorul de click-uri (util când au loc mai multe clickuri succesive);
   - numărul de ordine al ferestrei (în ordinea în care ferestrele au fost creeate).
Aceste informații pot fi obținute folosind metodele și măștile din clasele java.awt.event.MouseEvent și java.awt.event.InputEvent.
 
Exemplu
În fișierul EvMouse1.java este dat un exemplu de aplicație, în care se urmăresc situațiile în care este apăsat unul dintre butoanele mouse-ului, atunci când cursorul acestuia se găsește pe suprafața ferestrei aplicației. Întrucât nu se folosesc toate metodele interfeței MouseListener, clasa ascultătorului de mouse AMouse s-a creat prin extinderea clasei java.awt.event.MouseAdapter.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class EvMouse1 {
  static JFrame iug;  // referinta la fereastra
  static AF af; // referinta la ascultator de fereastra
  static AMouse am; // referinta la ascultator de mouse

  /* Clasa imbricata pentru ascultatorul de fereastra */ 
  static class AF extends WindowAdapter {
   public void windowClosing(WindowEvent e) {
    System.exit(0); // incheierea executarii aplicatiei
   }
  }

  /* Clasa imbricata pentru ascultatorul de mouse */
  static class AMouse extends MouseAdapter {
   public void mousePressed(MouseEvent e) {
    int x=e.getX(), y=e.getY(), n=e.getClickCount(), 
      mod=e.getModifiers(), buton=0;
    String mesaj="S-a apasat butonul ";
    if((InputEvent.BUTTON1_MASK & mod) != 0) buton=1;
    else if((InputEvent.BUTTON2_MASK & mod) !=0) buton=2;
    else if((InputEvent.BUTTON3_MASK & mod) !=0) buton=3;
    mesaj+=buton+" x="+x+" y="+y+" contor="+n+" mod="+mod;
    if(e.isControlDown()) mesaj+=" Ctrl";
    if(e.isAltDown())    mesaj+=" Alt";
    if(e.isShiftDown())  mesaj+=" Shift";
    System.out.println(mesaj);
   }
  }

  /* Metoda principala */
  public static void main(String args[]) throws Exception {
    af=new AF(); // instantierea ascultatorului
    am=new AMouse(); // instantierea ascultatorului de mouse
    iug=new JFrame("Urmarire evenimente de mouse");
    iug.setSize(300,100);
    iug.setLocation(new Point(100,50));
    iug.setVisible(true);
    iug.addWindowListener(af); // adaugarea ascultatorului de fereastra
    iug.addMouseListener(am); // adaugarea ascultatorului de mouse
  }
}

În metoda mousePressed() a clasei AMouse se determină coordonatele punctului în care s-e găsește cursorul la apăsarea butonului,  invocând metodele getX() și getY() ale clasei MouseEvent. Se determină numărul de apăsări succesive rapide, invocând metoda getClickCount() a aceleeași clase. 
Pentru a afla ce buton a fost apăsat, se procedează astfel: 
  - se determină codul modificatorilor, invocând metoda getModifiers() din clasa InputEvent;
  - se aplică asupra acestui cod măștile butoanelor, folosind operatorul de intersecție pe biți &. Butonul de mouse a cărui mască, intersectată cu codul mod, dă rezultat nenul este cel apăsat.
Codul modificatorilor mod poate fi folosit și pentru a determina daca, în timp ce s-a apăsat butonul de mouse, era apăsată și una din tastele auxiliare Ctrl, Alt sau Shift, folosind măștile corespunzătoare acestor taste. Totuși, aici s-a preferat utilizarea metodelor isControlDown(), isAltDown() și isShiftDown() ale clasei InputEvent.

Toate măștile folosite în această aplicație sunt definite în clasa java.awt.event.InputEvent.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați