miercuri, 6 februarie 2019

Tratarea evenimentelor Java (II).

Dacă am privi din punct de vedere al codului, evenimentul nu este altceva decât o metodă care este executată atunci când utilizatorul acționează o componentă de pe suprafața aplicației. 

Dacă vorbim de evenimentul click pe un buton, sau oricare altă componentă, atunci metoda invocată va fi actionPerformed()care aparține interfeței ActionListener. Deci, metodele invocate la generarea unui eveniment fac parte din interfețe specifice evenimentului generat. 

Orice eveniment în Java este o instanță a unei subclase a clasei Event. La executare click pe o componentă buton, se va crea de fapt o instanță a clasei ActionEvent. Amintind principiul moștenirii în Java, o clasă extinde o singură clasă și numai una, în cazul în care clasa cu care lucrăm extinde deja o clasă nu vom putea extinde și clasa evenimentului generat pentru a oferi mecanism de tratare a acestuia. De aceea fiecărei clase de evenimente îi corespunde o interfață ce grupează  evenimentele specifice unui anumit domeniu, numite și interfețe de ascultare sau interfețe listener. Cât despre interfețe, o clasă Java, poate implemente orice număr de interfețe. 
De exemplu, evenimentele tastaturei, sunt de fapt instanțe a clasei KeyEvent căreia îi corespunde interfața KeyListener ce conține mai multe metode de tratare a evenimentelor tastaturei. 

Voi prezenta câteva clase de evenimente și interfețele corespunzătoare acestora, situații când  aceste clase sunt instanțiate, și componente ce pot genera evenimentele grupate de interfețele date: 
Orice clasă care tratează evenimente trebuie să implementeze obligatoriu metodele interfețelor de ascultare sau interfețelor Listener corespunzătoare evenimentelor care le tratează. 
În tabelul de mai jos voi reprezenta metodele conținute de aceste interfețe:

În postarea https://musteatadidactic.blogspot.com/2019/02/tratarea-evenimentelor-java.html am explicat cum are loc tratarea evenimentului click pe o componentă de tip buton. Analogic se respectă și algoritmul de tratare a oricărui alt tip de eveniment. Dacă se va dori tratarea evenimentului generat la selectarea unei opțiuni dintr-o componentă de tip Choice, atunci se va implementa interfața ItemListener și se va supradefini metoda itemStateChanged(). De fapt, codul conținut de această metodă va fi executat la generarea acestui tip de eveniment.

E simplu atunci când se lucrează cu interfețe care conțin o singură metodă. În cazul în care aceasta va conține mai multe metode, ca de exemplu WindowListener, atunci va fi necesar de supradefinit toate metodele interfețelor chiar dacă nu se dorește acest lucru. Orice clasă ce implementează o interfață trebuie să conțină corp, să supradefinească, să facă override, :) :) , după cum menționează elevii mei dragi, la toate metodele interfeței.
Ce facem în cazul în care nu dorim acest lucru?
Ok! Voi veni în zilele următoare cu o postare despre clasele Adapter !

Sper că această postare vă este utilă.

Este binevenit orice comentariu!

Să aveți parte de o zi extraordinară !!!!!










































Tratarea evenimentelor Java (I).

Un eveniment este o acțiune a utilizatorului asupra unei componente grafice și reprezintă mecanismul prin care utilizatorul comunică efectiv cu programul. 

De exemplu: 
1) acționarea unui buton;
2) tastarea unei taste;
3) mutarea unei componente cu butonul mouse-ului;
4) închiderea unei ferestre;
5) redimensionarea unei ferestre, ș.a

Toate componentele generează evenimente atunci când utilizatorul acționează asupra acestora într-un anumit mod. 


Evenimentele sunt de diferite tipuri fiecare tip fiind reprezentat de o clasă distinctă. Programatorul nu se va preocupa de generarea evenimentelor, deoarece acestea sunt generate în mod automat atunci cînd utilizatorul interacționează cu aplicația. Însă programatorul trebuie să indice instrucțiunile care vor fi executate în momentul în care apar aceste evenimente. 



Atunci când este lansat un eveniment, acesta este capturat de unul sau mai mulți ascultători. 

Un ascultător este o clasă ce implementează interfețe de tip Listener definite în pachetul java.awt.event și care au ca scop capturarea și tratarea evenimentului generat.

Atunci cînd se dorește tratarea evenimentelor, programatorul trebuie să creeze un obiect ascultător și apoi să îl înregistreze la componenta grafică care a generat evenimentul. 

Înregistrarea se face prin apelarea metodei addXListener(XListener listener) asupra componentei care lansează evenimentul, unde X reprezintă tipul de eveniment pentru care se înregistrează ascultătorul. 
De exemplu : addWindowListener(...), addItemListener(...)

Mecanismul gestionării evenimentelor în Java poate fi reprezentată schematic astfel: 


Componenta reprezintă sursa de evenimente.
Eveniment este generat de o componentă.
Ascultătorul sau Listener-ul captează și tratează evenimentul generat.


Pentru a trata un eveniment se va respecta la general următorul algoritm (pentru exemplificare vom trata evenimentul click cu mouse-ul pe o componentă): 

1. clasa ce conține componenta care va genera evenimentul trebuie să implementeze o interfață Listener, sau să extindă o clasă care deja implementează această interfață: 

public class ClasaMea implements ActionListener { ... }

2. ascultătorul de evenimente se înregistrează la sursa de evenimente prin intermediul metodei addXListener(XListener listener)

oComponenta.addActionListener(instantaClasaMea); 

3. ascultătorul implementează metodele interfeței de ascultare: 
       public void actionPerformed(ActionEvent e) { 

        ...//codul ce se va executa ca răspuns la eveniment 

       }


Exemplu:

import java.awt.*;
import java.awt.event.*;
class Aplicatia_Mea extends Frame implements ActionListener{
 Aplicatia_Mea(String s){
  super(s);
  setSize(350,100);
  setLayout(new FlowLayout());
  Button b1 = new Button("Ok!");
  b1.addActionListener(this);
  add(b1);
  setVisible(true);
 }
@Override
public void actionPerformed(ActionEvent e) {
 this.setTitle("generat, capturat si tratat");
}}
public class Test_OnLick {
 public static void main(String[] args) {
     new Aplicatia_Mea("Exemplu de eveniment");
}}
Lansată la execuția aplicația va avea aspectul:




După executarea butonul ok!  va fi modificat corespunzător titlul ferestrei:





Aceasta este una din modalitățile prin care putem trata evenimente în Java. Analogic se respectă acești pași și pentru celelate tipuri de evenimente, diferență fiind interfața cu care se lucrează. 

Există și alte tehnici despre care voi expune în una din următoarele postări. La fel și despre alte tipuri de evenimente ce pot fi tratate.

Sper că această postare vă este utilă. 

Este binevenit orice comentariu! 

Să aveți parte de o zi extraordinară !!!!!