Evenimentele generate de o fereastră

Pentru a ne familiariza cu modelul de evenimente al platformei Java 2,  vom urmări acum evenimentele generate de o fereastră și modul cum acestea pot fi tratate. Vom folosi în acest scop o interfață din clasa javax.swing.JFrame. Aceasta este derivată din clasa java.awt.Frame care, la rândul ei, este derivată din clasa java.awt.Window. Evenimentele prezentate în această secțiune sunt generate de orice instanță a clasei Window și ale subclaselor sale.

Evenimentele generate de fereastră sunt instanțe ale clasei WindowEvent și sunt ascultate de instanțe ale unor clase care implementează interfața WindowListener sau extind clasa WindowAdapter. Toate aceste clase și interfețe se găsesc în pachetul java.awt.event.
 
Metodele interfeței WindowListener sunt următoarele:
  public void windowOpened(WindowEvent e)- fereastra a fost deschisă
  public void windowClosing(WindowEvent e)- fereastra se închide
  public void windowClosed(WindowEvent e)- fereastra a fost inchisă
  public void windowIconified(WindowEvent e)- fereastra a fost iconificată
  public void windowDeiconified(WindowEvent e)- fereastra a fost deiconificată
  public void windowActivated(WindowEvent e)- fereastra a fost activată
  public void windowDeactivated(WindowEvent e)- fereastra a fost dezactivată

Pentru a se trata evenimentele generate de fereastră, este necesar să se declare o clasă care implementează interfața WindowListener. În această clasă se definesc toate metodele interfeței, astfel încât acestea să execute acțiunile adecvate evenimentelor corespunzătoare.
 
Exemplu
În fișierul Evenim1.java este dat ca exemplu următorul program, în care se urmăresc evenimentele generate de o fereastră din clasa JFrame.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Evenim1 {
  static JFrame iug; // referinta la interfata grafica
  static AscultFereastra af; // referinta la ascultator

  /* Clasa imbricata pentru ascultatorul de fereastra */
  static class AscultFereastra implements WindowListener {
   public void windowOpened(WindowEvent e) {
    System.out.println("Fereastra a fost deschisa: "+e);
   }
   public void windowClosing(WindowEvent e) {
    System.out.println("Fereastra se inchide: "+e);
   }
   public void windowClosed(WindowEvent e) {
    System.out.println("Fereastra a fost inchisa: "+e);
   }
   public void windowIconified(WindowEvent e) {
    System.out.println("Fereastra a fost iconificata: "+e);
   }
   public void windowDeiconified(WindowEvent e) {
    System.out.println("Fereastra a fost deiconificata: "+e);
   }
   public void windowActivated(WindowEvent e) {
    System.out.println("Fereastra a fost activata: "+e);
   }
   public void windowDeactivated(WindowEvent e) {
    System.out.println("Fereastra a fost dezactivata: "+e);
   }
  } // se incheie clasa ascultatorului de fereastra

  /* Metoda principala */
  public static void main(String args[]) throws Exception {
    af=new AscultFereastra(); // instantierea ascultatorului
    iug=new JFrame("Urmarire evenimente fereastra"); 
    iug.setSize(300,100);
    iug.setLocation(new Point(100,50));
    iug.setVisible(true);
    iug.addWindowListener(af); // adaugarea ascultatorului
    System.out.println("Titlul ferestrei este: "+iug.getTitle());
    System.out.println("Coltul din stanga sus este in punctul: "+
      iug.getLocation());
    System.out.println("Dimensiunile ferestrei: "+iug.getSize());
  }
}

Pentru ascultătorul de fereastră a fost creată clasa imbricată statică AscultFereastra, în care sunt implementate toate metodele interfeței WindowListener. În cazul de față, aceste metode nu fac altceva, decât că afișează pe terminal un mesaj privind evenimentul care s-a produs. Acest mesaj conține și evenimentul interceptat e, convertit în șir. În metoda main(), se construiesc instanțele claselor JFrame și AscultFereastra, după care se adaugă ascultătorul af  la fereastra  iug  prin metoda addWindowListener(). Se stabilesc, de asemenea, dimensiunea și poziția ferestrei și se face fereastra vizibilă.

După ce a fost pusă aplicația în execuție, pe ecran apare o fereastră cu titlul "Urmarire evenimente fereastra". La terminal putem urmări succesiunea evenimentelor care se produc. Ca și în exemplul precedent, ieșirea din aplicație se face de la tastatura, prin comanda <Control>-C.

Remarcăm că, în exemplul de mai sus, a fost necesar ca, în clasa care implementează interfata WindowListener, să se definească toate metodele acesteia. Dacă ne sunt necesare numai unele din aceste metode, este preferabil sa obținem clasa AscultFereastra prin extinderea clasei WindowAdapter. Această ultimă clasă conține toate metodele interfeței WindowListener, dar corpurile lor sunt vide, deci metodele nu fac nimic. În acest fel, în clasa derivată este suficient să redefinim numai metodele care ne sunt necesare, ca în exemplul din secțiunea următoare.

Terminarea aplicației la închiderea ferestrei

Pentru ca la acționarea butonului de închidere din colțul din dreapta-sus al ferestrei să se închidă nu numai fereastra respectivă, ci si aplicația, este necesar ca metoda windowClosing() a ascultătorului de fereastră să conțină invocarea metodei System.exit(0) din clasa System. Dacă nu dorim să utilizam și alte metode de tratare a evenimentelor generate de fereastră, vom deriva clasa de ascultare a ferestrei AF din clasa WindowAdapter.
 
Exemplu
În fișierul Inchidere.java se dă o modificare a clasei Evenim1 din exemplul precedent.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Inchidere {
  static JFrame iug;  // referinta la fereastra
  static AF af; // referinta la ascultator

  /* Clasa imbricata pentru ascultatorul de fereastra */ 
  static class AF extends WindowAdapter {
   public void windowActivated(WindowEvent e) {
    System.out.println("Fereastra a fost activata");
   }
   public void windowDeactivated(WindowEvent e) {
    System.out.println("Fereastra a fost dezactivata");
   }
   public void windowClosing(WindowEvent e) {
    System.out.println("Fereastra se inchide");
    System.exit(0); // incheierea executarii aplicatiei
   }
  }

  /* Metoda principala */
  public static void main(String args[]) throws Exception {
    af=new AF(); // instantierea ascultatorului
    iug=new JFrame("Urmarire evenimente fereastra");
    iug.setSize(300,100);
    iug.setLocation(new Point(100,50));
    iug.setVisible(true);
    iug.addWindowListener(af); // adaugarea ascultatorului
    System.out.println("Titlul ferestrei este: "+iug.getTitle());
    System.out.println("Coltul din stanga sus este in punctul: "+
      iug.getLocation());
    System.out.println("Dimensiunile ferestrei: "+iug.getSize());
  }
}

În acest program, în afară de modificarea numelor claselor, s-au mai făcut următoarele modificări:
  - clasa de ascultare a evenimentelor AF extinde clasa WindowAdapter, deci implementează in mod indirect interfața WindowListener, prin intermediul acesteia;
  - s-au definit numai trei din cele șapte metode ale intefeței WindowListener; celelalte metode sunt moștenite de la clasa WindowAdapter, deci nu fac nimic;
  - în metoda windowClosing()s-a introdus instrucțiunea System.exit(0); În consecință, când acționăm butonul de închidere al ferestrei, sau selectăm optiunea Close din meniu, se încheie executarea aplicației.



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