کنترل کننده رویداد

Swing از مکانیزم کنترل کننده رویداد (Event Handler)، برای کنترل رویدادهایی که در هنگام اجرای برنامه به وقوع می‌پیوندند، استفاده می‌کند. رویدادها، رفتارهایی یا اتفاقاتی هستند که، هنگام اجرای برنامه به وقوع می‌پیوندند. کنترل رویداد فرایند نظارت بر وقوع یک رویداد مشخص می‌باشد. فرم‌های ویندوزی از کنترل کننده رویداد برای اضافه کردن یک قابلیت و پاسخ به کاربر استفاده می‌کنند. بدون کنترل کننده رویداد، فرم‌ها و رابط گرافیکی تا حد زیادی بدون استفاده هستند. کنترل رویداد در Swing دارای سه جزء است :

  • رویداد (Event) : یک رویداد، تغییر حالت یک شیء (مثلاً یک جعبه متن) است .
  • منبع رویداد (Event Source) : شیئی است که رویداد را تولید می‌کند (مثلاً دکمه‌ای که رویداد کلیک را تولید می‌کند).
  • شنونده رویداد (Event Listener) : اینترفیسی است که منتظر وقوع رویداد است.

مکانیسم کنترل رویداد در جاوا به این صورت است :

در جدول زیر کلاس‌های رویداد، اینترفیس ها و متدهای این اینترفیس ها که در کنترل رویدادها به کار برده می‌شوند. این کلاس‌ها و اینترفیس ها در پکیج‌های java.util، java.awt و java.awt.event قرار دارند.

شنونده رویداد متدهای شنونده رویداد کلاس رویداد متد اضافه کننده
ActionListener actionPerformed ActionEvent addActionListener
AdjustmentListener adjustmentValueChanged AdjustmentEvent addAdjustmentListener
ComponentListener componentHidden ComponentEvent addComponentListener
componentMoved
componentResized
componentShown
ContainerListener componentAdded ContainerEvent addContainerListener
componentRemoved
FocusListener focusGained FocusEvent addFocusListener
focusLost
ItemListener itemStateChanged ItemEvent addItemListener
KeyListener keyPressed KeyEvent addKeyListener
keyReleased
keyTyped
MouseListener mouseClicked MouseEvent addMouseListener
mouseEntered
mouseExited
mousePressed
mouseReleased
MouseMotionListener mouseDragged MouseEvent addMouseMotionListener
mouseMoved
TextListener textValueChanged TextEvent addTextListener
WindowListener windowActivated WindowEvent addWindowListener
windowClosed
windowClosing
windowDeactivated
windowDeiconified
windowIconified
windowOpened

به ستون آخر سمت چپ جدول بالا توجه کنید. همانطور که در ابتدای درس اشاره کردیم بعد از پیاده سازی شنونده توسط یک کلاس باید آن کلاس را به کنترل مورد نظرمان وصل کنیم این کار را با متدهایی انجام می‌دهیم که اسم آنها با کلمه add شروع می‌شود که در جدول بالا و در ستون (متد اضافه کننده) نام این متدها ذکر شده است. به علت کمبود فضا در جدول بالا در جداول زیر کاربرد کلاس‌های رویداد و متدها (ستون دوم و سوم) آمده است :

متد توضیح
actionPerformed وقتی یک رویداد اکشن اتفاق می افتد فراخوانی می‌شود
adjustmentValueChanged
componentHidden وقتی که یک کنترل مخفی شود فراخوانی می‌شود
componentMoved وقتی که یک کنترل حرکت کند فراخوانی می‌شود
componentResized وقتی که اندازه یک کنترل تغییر کند فراخوانی می‌شود
componentShown وقتی که یک کنترل نمایش داده شود فراخوانی می‌شود
componentAdded وقتی که یک کنترل اضافه شود فراخوانی می‌شود
componentRemoved وقتی که یک کنترل حذف شود فراخوانی می‌شود
focusGained وقتی کنترل فوکوس می‌گیرد فراخوانی می‌شود
focusLost وقتی کنترل فوکوس از دست می‌دهد فراخوانی می‌شود
itemStateChanged وقتی آیتم انتخاب شده تغییر می‌کند فراخوانی می‌شود
keyPressed وقتی کاربر یک کلید را فشار می‌دهد فراخوانی می‌شود
keyReleased وقتی کاربر کلید را آزاد می‌کند فراخوانی می‌شود
keyTyped وقتی کاربر کلید را فشرده و سپس رها می‌کند فراخوانی می‌شود
mouseClicked وقتی کاربر با ماوس کلیک می‌کند فراخوانی می‌شود
mouseEntered وقتی کاربر با ماوس روی یک کنترل می‌کند رود فراخوانی می‌شود
mouseExited وقتی ماوس از محدود یک کنترل خارج می‌شود فراخوانی می‌شود
mousePressed وقتی کاربر دکمه ماوس را فشار می‌دهد فراخوانی می‌شود
mouseReleased وقتی کاربر دکمه ماوس را رها می‌کند فراخوانی می‌شود
mouseDragged وقتی با ماوس یک کنترل را Drag می‌کنید فراخوانی می‌شود
mouseMoved وقتی نشانگر ماوس جابجا شود فراخوانی می‌شود
textValueChanged وقتی مقدار متن کنترل تغییر کند فراخوانی می‌شود
windowActivated هنگام فعال شدن پنجره فراخوانی می‌شود.
windowClosed هنگام بسته شدن پنجره فراخوانی می‌شود
windowClosing وقتی پنجره در حال بسته شدن است فراخوانی می‌شود
windowDeactivated وقتی پنجره غیر فعال می‌شود فراخوانی می‌شود
windowDeiconified وقتی پنجره از حال آیکون به حالت عادی تغییر می‌کند فراخوانی می‌شود
windowIconified وقتی پنجره مینیمایز می‌شود فراخوانی می‌شود
windowOpened وقتی پنجره باز می‌شود فراخوانی می‌شود
کلاس رویداد توضیحات
ActionEvent وقتی تولید می‌شود که بر روی یک دکمه کلیک، یک آیتم انتخاب و یا بر روی لیست آیتم کلیک شود.
MouseEvent وقتی تولید می‌شود که ماوس Drag یا کلیک شود و یا از یک کنترل خارج و یا وارد یک کنترل شود.
KeyEvent وقتی تولید می‌شود که یک دکمه از صفحه کلید توسط کاربر فشرده شود.
ItemEvent وقتی تولید می‌شود که check-box یا list item کلیک شود.
TextEvent وقتی تولید می‌شود که مقدار textarea یا textfield تغییر کند.
MouseWheelEvent وقتی تولید می‌شود کهدکمه وسط ماوس حرکت داده شود.
WindowEvent وقتی تولید می‌شود که پنجره فعال، غیرفعال، بسته و … شود.
ComponentEvent وقتی تولید می‌شود که یک کنترل مخفی شود، حرکت کند، اندازه‌اش تغییر کند.
ContainerEvent وقتی تولید می‌شود که یک کنترل به پنجره اضافه و یا از آن حذف شود.
AdjustmentEvent وقتی تولید می‌شود که اسکرول تغییر کند.
FocusEvent وقتی تولید می‌شود که یک کنترل فوکوس گرفته و یا فوکوس خود را از دست بدهد.

برای درک بهتر کنترل رویداد (Event handling) به یک مثال توجه کنید. فرض کنید که می‌خواهیم وقتی بر روی یک دکمه کلیک شد یک پیام نمایش داده شود. برنامه NotePad را باز کرده و کدهای زیر را در داخل آن نوشته و سپس با نام FrameDemo ذخیره کنید :

   1: import javax.swing.*;
   2: import java.awt.event.*;
   3: 
   4: public class FrameDemo 
   5: {
   6:     public static void main(String[] args)
   7:     {
   8:         JFrame frame1 = new JFrame("Event Handling in JAVA");
   9:         frame1.setSize(356 , 263);
  10:         frame1.setVisible(true);
  11:         
  12:         JButton button1 = new JButton("Click Me!");
  13:         frame1.add(button1);
  14:         
  15:         class ListenToClick implements ActionListener                   //Step 1
  16:         {
  17:             @Override
  18:             public void actionPerformed(ActionEvent e)
  19:             {
  20:                 JOptionPane.showMessageDialog(null, "Hello world!");    //Step 2
  21:             }
  22:         }
  23:         
  24:         button1.addActionListener(new ListenToClick());                 //Step 3              
  25:     }   
  26: }

در مثال بالا چون ما قرار است از کنترل‌های Swing استفاده و همچنین رویدادها را کنترل کنیم ابتدا کلاس‌ها و پکیج‌های مربوطه را در خطوط 1 و 2 اضافه می‌کنیم. سپس در خطوط 13-8 یک فریم ایجاد و یک دکمه به آن اضافه می‌کنیم. در درس‌های بعد در مورد این دو کنترل و همچنین این کدها بیشتر توضیح می‌دهیم.
حال نوبت به سه مرحله‌ای می‌رسد که در ابتدای درس توضیح دادیم :

حال برنامه را اجرا کرده و با کلیک بر روی دکمه نتیجه را مشاهده نمایید :
event-handilng-in-java-01
خطوط 24-15 کد بالا را به دو صورت زیر هم می‌توان نوشت :

ActionListener ListenToClick = new ActionListener()             //Step 1
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JOptionPane.showMessageDialog(null, "Hello world!");    //Step 2
    }
};
        
button1.addActionListener(ListenToClick);                       //Step 3

یا به صورت خلاصه‌تر زیر :

button1.addActionListener(new ActionListener()                   //Step 1 , Step3
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JOptionPane.showMessageDialog(null, "Hello world!");    //Step 2
    }
});

در آخر این نکته را یادآور می‌شوم که ما در مثال بالا برخی از موارد مانند تعیین اندازه و محل قرار کیری دکمه و … را توضیح نداده‌ایم تا شما اصل مطلب که همان کنترل رویداد است را یاد بگیرید. در درس‌های آینده در مورد کنترل‌های Swing بیشتر توضیح می‌دهیم.