هناك الكثير من الأحداث التي قد يرغب المبرمج في ربط كود لاحق معها. أمثلة: عند إغلاق النافذة أظهر رسالة تأكيد للمستخدم، عند ضغط الزر أظهر النافذة الفلانية، إلخ ...
ويتم ذلك عادة بإضافة متنصتات الأحداث كما هو معروف.
ولكن ماذا لو أردت أن تصنع أنت نظام أحداث خاص بك ؟
حسناً، إحدى الطرق هي المذكورة بشكل رائع في مدونة الأخ علاء الصالحي.
لكن مهلاً ! هناك طريقة أكثر ديناميكية وأناقة، وهي تستخدم بشكل قياسي مع الـ JavaBeans، وهي التنصت على الخصائص.
الأمر بسيط جداً، فلدعم التنصت على تغير الخصائص في برنامجك عليك القيام بمايلي:
• إنشاء غرض من الفئة PropertyChangeSupport
• إعلان أي تغيرات على الخصائص عند حدوثها باستخدام firePropertyChange
• تحقيق الطريقتين addPropertyChangeListener و removePropertyChangeListener لإضافة وإزالة المتنصتات
وهذا مثال توضيحي:
package PropertyChange;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
// هذا الصف هو JavaBean تمثل سيارة
public class Car implements Serializable {
// ننشئ غرض من فئة PropertyChangeSupport لكي ندعم الأحداث عند تغير الخصائص
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private String color = "Red"; // اللون
private int speed = 0; // السرعة
private int number = 1000000; // الرقم
public Car() {
}
public String getColor() {
return color;
}
public int getNumber() {
return number;
}
public int getSpeed() {
return speed;
}
// لاحظ كيف نقوم باستدعاء الطريقة/الدالة firePropertyChange ونمرر لها ثلاث موسطات (parameters):
// اسم الخاصة التي يتم تغييرها
// القيمة القديمة قبل التعديل
// القيمة الجديدة بعد التعديل
public void setColor(String color) {
String old = this.color;
this.color = color;
this.pcs.firePropertyChange("color", old, color);
}
public void setNumber(int number) {
int old = this.number;
this.number = number;
this.pcs.firePropertyChange("number", old, number);
}
public void setSpeed(int Speed) {
int old = this.speed;
this.speed = Speed;
this.pcs.firePropertyChange("speed", old, speed);
}
// نقم هنا بتحقيق الطريقتين addPropertyChangeListener و removePropertyChangeListener لإضافة وإزالة المتنصتات
public void addPropertyChangeListener(PropertyChangeListener listener) {
this.pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
this.pcs.removePropertyChangeListener(listener);
}
}الآن دعنا نرى كيف يمكننا التنصت على تلك الأحداث ... هذا صف اختبار:
package PropertyChange;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class Test {
public static void main(String[] args) {
Car car = new Car();
car.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if ("color".equals(propertyName)) {
System.out.println("لقد تم تغيير اللون من " + e.getOldValue() + " إلى " + e.getNewValue());
} else if ("number".equals(propertyName)) {
System.out.println("لقد تم تغيير الرقم من " + e.getOldValue() + " إلى " + e.getNewValue());
} else if ("speed".equals(propertyName)) {
System.out.println("لقد تم تغيير السرعة من " + e.getOldValue() + " إلى " + e.getNewValue());
}
}
});
car.setColor("yellow");
car.setSpeed(80);
car.setNumber(65879464);
}
}سحر أليس كذلك ! :wink:
