Evenimente de tastă

De câte ori se apasă sau se eliberează o tastă, componenta activă a interfeței grafice generează un eveniment de tastă din clasa java.awt.event.KeyEvent. Acesta poate fi tratat cu un "ascultător de taste" care implementează interfața java.awt.event.KeyListener sau care extinde clasa java.awt.event.KeyAdapter.
 
Se disting următoarele evenimente generate la acționarea tastelor:
  - a fost apasată o tastă (KEY_PRESSED);
  - a fost eliberată o tastă (KEY_RELEASED);
  - a fost "tipărit" un caracter, adică a fost apasată și eliberată o tastă care transmite un caracter tipăribil (KEY_TYPED).
Aceste situații pot fi detectate cu metodele corespunzătoare ale interfeței KeyListener.

Evenimentul generat de tastă conține, în afară de codul tastei acționate, și informații privind starea tastelor auxiliare Ctrl, Alt și Shift în momentul producerii evenimentului respectiv. Aceste stări pot fi detectate cu metodele corespunzătoare ale interfeței superclasei java.awt.event.InputEvent.
 
Exemplu
În fișierul EvTaste.java se dă un exemplu de aplicație, în care se urmărește apariția unor evenimente de tastă, care sunt generate de fereastra aplicației, atunci când ea este activă și se actionează o tastă.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class EvTaste {
  static AF af=new AF(); // ascultatorul de fereastra
  static ATaste at=new ATaste(); // ascultatorul de taste
  static IUG iug=new IUG("Urmarirea evenimentelor de tasta");

  /* Clasa imbricata pentru interfata utilizator */
  static class IUG extends JFrame {
   /* Constructorul interfetei utilizator */
   IUG(String titlu) {
    super(titlu);
    setSize(300,100);
    setLocation(new Point(100,50));
    setVisible(true);
    addWindowListener(af); // adaugarea ascultatorului de fereastra
    addKeyListener(at); // adaugarea ascultatorului de taste
   }
  }

  /* 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 taste */
  static class ATaste implements KeyListener {
   public void keyTyped(KeyEvent e) {
    System.out.println(e);
   }
   public void keyPressed(KeyEvent e) {
    System.out.println(e);
   }
   public void keyReleased(KeyEvent e) {
    System.out.println(e);
   }
  }

  /* Metoda principala */
  public static void main(String args[]) {
  }
}

Ascultătorul de taste este realizat prin clasa imbricată ATaste, care implementează interfața KeyListener. Așa cum sunt ele redefinite aici, metodele ascultătorului de taste afișează evenimentul respectiv la terminal.

Punând în execuție această aplicație, putem urmări la terminal succesiunea evenimentelor care sunt generate atunci când acționam tastele. Remarcăm, de asemenea, că aceste evenimente sunt generate numai atunci când fereastra aplicației este activă.
 

Pentru a detecta în ce condiții a fost generat evenimentul (codul tastei care a fost apasată, inscripția de pe tastă, ce taste auxiliare erau apăsate), putem utiliza metodele claselor KeyEvent și superclasei acesteia InputEvent.
 
Exemplu
În fișierul EvTaste1.java este dat un exemplu de aplicație în care se folosesc metodele din clasele KeyEvent și InputEvent pentru a detecta situațiile în care au apărut evenimentele captate de către ascultătorul de taste. Acesta a fost realizat prin extinderea clasei KeyAdapter.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class EvTaste1 {
  static AF af=new AF(); // ascultatorul de fereastra
  static ATaste at=new ATaste(); // ascultatorul de taste
  static IUG iug=new IUG("Urmarirea evenimentelor de tasta");

  /* Clasa imbricata pentru interfata utilizator */
  static class IUG extends JFrame {
   /* Constructorul interfetei utilizator */
   IUG(String titlu) {
    super(titlu);
    setSize(300,100);
    setLocation(new Point(100,50));
    setVisible(true);
    addWindowListener(af); // adaugarea ascultatorului de fereastra
    addKeyListener(at); // adaugarea ascultatorului de taste
   }
  }

  /* 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 taste */
  static class ATaste extends KeyAdapter {
   public void keyPressed(KeyEvent e) {
    int cod=e.getKeyCode(), mod=e.getModifiers();
    String mesaj="S-a apasat tasta de cod "+cod+" "+e.getKeyText(cod);
    if(mod!=0) 
      mesaj+=" cu modificatorii: "+e.getKeyModifiersText(mod);
    System.out.println(mesaj);
   }
   public void keyTyped(KeyEvent e) {
    System.out.println("S-a introdus caracterul "+e.getKeyChar());
   }
  }

  /* Metoda principala */
  public static void main(String args[]) {
  }
}

Punând în execuție această aplicație, putem urmări la terminal evenimentele de apăsare a unei taste (KEY_PRESSED) și de introducere a unui caracter (KEY_TYPED) afișate sub formă decodificată.

Pentru detalii privind metodele disponibile în clasele KeyAdapter, KeyEvent și InputEvent se poate consulta documentația Java API.



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