1. Hadisələrlə tanışlıq
Proqramlaşdırmada hadisə — nəyinsə baş verdiyini bildirən siqnaldır. Bu, düymənin basılması, mətnin daxil edilməsi, məlumatların yüklənməsinin tamamlanması, dəyişənin dəyərinin dəyişməsi — tətbiqinizdə baş verə bilən və siz, inkişafçı kimi, reaksiya vermək istədiyiniz hər şey ola bilər.
Analogiya aparsaq, hadisə — qapı zəngi kimidir: kimsə gəlib və siz qərar verirsiniz, sonra nə etməli. Qapını aça, görməməzlikdən gələ, evdə yoxmuş kimi davrana və ya hətta hamını çağırıb kimin gəldiyinə baxdıra bilərsiniz. Proqramlaşdırmada hadisə — bu “zəng”dir, sizin reaksiyanız isə hadisə handledicisidir.
Java-da hadisələr reaktiv və qrafik proqramlaşdırmanın (GUI) təməlidir. Onlar olmasa, düymələr, açılan siyahılar, pəncərə tətbiqləri və hətta bir çox server sistemləri olmazdı.
Dinləyici (Listener): kimdir və nə üçün lazımdır
Dinləyici (Listener) — müəyyən bir hadisəyə abunə olan və onun baş verməsini gözləyən obyekt-dir. Hadisə baş verən kimi dinləyici siqnal alır və təyin olunmuş reaksiya kodunu icra edir.
Java-da dinləyicilər adətən interfeyslər vasitəsilə reallaşdırılır. Ən geniş yayılmış nümunələrdən biri — ActionListener interfeysidir. Bu interfeysi, məsələn, düymənin basılmasına reaksiya verməli olan siniflər reallaşdırır.
Praktikada qarşılıqlı əlaqə belə qurulur: hadisə mənbəyi var, məsələn, düymə, və dinləyici var — lazımi interfeysi reallaşdıran obyekt. Mənbə ona abunə olan bütün dinləyicilərin siyahısını saxlayır. İstifadəçi düyməni basanda, hadisə mənbəsi hər bir dinləyicidə xüsusi metodu çağırır.
Bu sxem xəbərlərə abunə olmağa bənzəyir: siz abunəsinizsə, bildirişlər gələcək. Java-da belə bildiriş dinləyici metodunun çağırılmasıdır, hansı ki əvvəlcədən təsvir edilmiş hərəkətləri yerinə yetirir.
2. Hadisə interfeysləri: ActionListener, MouseListener və digərləri
Java-da hər hadisə tipi üçün öz dinləyici interfeysi var:
| Hadisə tipi | Dinləyici interfeysi | Harada istifadə olunur |
|---|---|---|
| Fəaliyyət | |
Düymələr, menyular, taymerlər |
| Siçan | |
Siçana reaksiya verən komponentlər |
| Klaviatura | |
Mətn sahələri, istənilən komponentlər |
| Dəyişiklik | |
Slayderlər, checkbox-lar, məlumat modelləri |
| Sənəd | |
Mətn dəyişiklikləri (məsələn, JTextField) |
Bu cür hər interfeys reallaşdırılması lazım olan bir və ya bir neçə metodu müəyyənləşdirir. Məsələn, ActionListener actionPerformed(ActionEvent e) metodunun reallaşdırılmasını tələb edir.
Nümunə: ActionListener
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Düymə basıldı!");
}
}
3. Hadisə modelinin iş prinsipi
Java-nın bütün hadisə modeli sadə, lakin güclü bir mexanizmə əsaslanır:
- Hadisə mənbəyi (məsələn, düymə) dinləyicilərin siyahısını saxlayır.
- Hansısa hərəkət baş verəndə (məsələn, istifadəçi düyməni klikləyəndə) mənbə hadisə obyekti yaradır (məsələn, ActionEvent).
- Mənbə qeydiyyatda olan bütün dinləyiciləri sıra ilə gəzərək onlarda müvafiq metodu çağırır (məsələn, actionPerformed), hadisə obyektini ötürür.
- Hər bir dinləyici həmin hadisə ilə nə edəcəyinə özü qərar verir.
Hadisələrin işləmə sxemi:
flowchart LR
A[İstifadəçi düyməni basdı] --> B[Düymə hadisə yaratdı]
B --> C[Düymə bütün dinləyicilər üçün actionPerformed çağırır]
C --> D[Dinləyici reaksiya verir: öz kodunu icra edir]
Kod nümunəsi:
import javax.swing.*;
public class EventDemo {
public static void main(String[] args) {
JButton button = new JButton("Məni bas!");
button.addActionListener(new MyActionListener());
JFrame frame = new JFrame("Hadisə nümunəsi");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(button);
frame.setSize(200, 100);
frame.setVisible(true);
}
}
İstifadəçi düyməni basanda, bütün dinləyicilərdə actionPerformed metodu işə düşür.
4. Nümunə: düyməyə dinləyici əlavə etmək
Gəlin klassik sxemi sadə bir nümunə üzərində nəzərdən keçirək.
Addım 1. Düymə yaradırıq
JButton button = new JButton("Salam de");
Addım 2. Dinləyici yaradırıq
class HelloListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Salam, dünya!");
}
}
Addım 3. Dinləyicini qeyd edirik
button.addActionListener(new HelloListener());
Qısa olaraq: bu, kodda necə görünür
JButton button = new JButton("Salam de");
button.addActionListener(new HelloListener());
5. Anonim siniflər və lambda ifadələri: qısa və rahat
Anonim sinif
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Anonim dinləyici: salam!");
}
});
Lambda ifadəsi (Java 8+)
button.addActionListener(e -> System.out.println("Lambda! Salam!"));
Lambda — hadisəyə reaksiyanız bir-iki sətirdirsə, dinləyici əlavə etməyin ən yığcam yoludur.
6. Bu sizin tətbiqinizlə necə əlaqəlidir?
Gəlin bu mexanizmi tədris tətbiqinizə inteqrasiya edək. Məsələn, bizdə “Tapşırıq əlavə et” düyməsi olan sadə bir pəncərə var. Düymə basılanda yeni tapşırığı siyahıya əlavə etmək və mesaj çıxarmaq istəyirik.
Kod nümunəsi:
import javax.swing.*;
import java.awt.event.ActionListener;
public class TaskManagerGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("Tapşırıq meneceri");
JButton addButton = new JButton("Tapşırıq əlavə et");
// Dinləyici kimi lambda-dan istifadə edirik
addButton.addActionListener(e -> {
System.out.println("Tapşırıq əlavə edildi!");
// Burada tapşırığın siyahıya əlavə olunması məntiqi ola bilərdi
});
frame.add(addButton);
frame.setSize(300, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
İndi tətbiqiniz sadəcə təlimatları icra etmir, həm də istifadəçi hərəkətlərinə “reaksiya verir”!
7. Dinləyicilər və hadisələrlə işləyərkən tipik səhvlər
Xəta №1: dinləyicini qeyd etməyi unutmaq. Dinləyici yaratmısınızsa, amma onu hadisə mənbəyinə əlavə etməmisinizsə, kodunuz heç vaxt çağırılmayacaq. Bu, jurnalın abunəsinə yazılmağa bənzəyir, amma ərizəni göndərmirsiniz — jurnal gəlmir.
Xəta №2: eyni dinləyicini bir neçə dəfə qeyd etmək. Təsadüfən eyni dinləyicini bir neçə dəfə əlavə etsəniz, handledici nə qədər əlavə etmisinizsə o qədər dəfə çağırılacaq. Bəzən bu faydalıdır, amma çox vaxt qəribə xətaların mənbəyidir (“nəyə görə funksiyam üç dəfə işləyir?!”).
Xəta №3: dinləyicini silməyi unutmaq. Dinləyici artıq lazım deyil, amma siz onu silməmisinizsə, o, yaddaşda “asılı” qalır. Uzunömürlü tətbiqlərdə bu yaddaş sızmalarına gətirib çıxara bilər.
Xəta №4: handledicidə uzunmüddətli əməliyyatlar. Əgər ağır işi birbaşa handledicidə edirsinizsə (məsələn, internetdən məlumat yükləyirsinizsə), interfeys “donur” və istifadəçi narahat olur. Ağır işi ayrıca axında (thread) başlatmaq daha yaxşıdır.
Xəta №5: dinləyicidə emal olunmamış istisnalar. Əgər handledicinizdə istisna baş verərsə, bu, bütün hadisə zəncirini “öldürə” bilər. Xətaları jurnallaşdırın və istisnaları emal edin ki, tətbiq çökməsin.
GO TO FULL VERSION