b. Trình khách Globe.
2.2.4 Thuộc tính thể hiện sự thay đổi (bound property)
JavaBeans là từng thành phần riêng biệt nhưng vẫn có thể kết nối được với nhau thôg qua cơ chế gởi thông báo (massage). Khi thuộc tinh của một thành phần JavaBeans A thay đổi nó có thể thông báo cho thành phần JavaBean B khác biết để thành phần B này có cơ hội cập nhật lại những thơng tin cần thiết đối với thuộc tình của thành phần mà nó sử dụng
Cơ chế cài đặt để một thuộc tinh có thể thơng báo cho các thành phần JavaBeans khác biết khi nó thay đổi rất đơn giản, chỉ cần cài đặt hai phương thức dùng để đăng ký và loại bỏ một đối tượng listener nhưu sau:
public void
addPropertyChangeListener(PropertyChangeListener lsn) public void
removePropertyChangeListener(PropertyChangeListener lsn)
Trường hợp chỉ cần áp dụng cho một thuộc tính cụ thể ta cài theo mẫu sau:
public void
add<PropertyName>Listener(PropertyChangeListener lsn) public void
remove<PropertyName>Listener(PropertyChangeListener lsn)
Ví dụ một thành phần JavaBeans A có thuộc tính cho biết về kích thước là size, khi thuộc tính thay đổi để tất cả các thành phần JavaBeans khác đều biết đến sự thay đổi này ta cài đặt như sau:
public void addSizeListener(PropertyChangeListener lsn) public void removeSizeListener(PropertyChangeListener lsn)
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 99
Mỗi thành phần JavaBeans khác phải tự cài đặt một đối tượng listener từ giao diện PropertyChangeListener có nhiệm vụ phản ứng với những thay đổi
này, sau đó đăng ký với thành phần JavaBeabs A nhờ vào phương thức trên (add dùng để đăng ký còn remove dùng để loại bỏi đối tượng listener). Phương thức cần cài đặt cho giao diện PropertyChangeListener lsn là:
public void propertyChange (PropertyChangeEvent evt)
Các thủ tục trên đây là chỉ thực hiện nhiệm vụ đăng ký và tạo đối tượng listener mà thôi. Để các đối tượng listener này có thể nhạn biết được sự thay đổi của thuộc tính size ta phải gọi phương thức firePropertyChange của đối tượng PropertyChangeSsupport từ thành phần JaVaBeans A như sau:
public void firePropertyChange(String propertyName, Object oldValue, Object newValue)
phương thức này sẽ thông báo đến mọi đối tượng listener (bằng cách gọi phương thức propertyChange của listener) đẵ đăng ký với thuộc tính size của thành phần JavaBeans A sự thay đổi bao gồm giá trị trước khi thay đổi (oldValue), giá trị sau khi thay đổi (newValue) và tên của thuộc tính bị thay đổi (ở đây propertyName=”size”).
Thường thì firePropertyChange được gọi trong phương thức setter, nơi mà thuộc tính của thành phần JavaBeans thực sự bị thay đổi giá trị.
Dưới đây là cách cài đặt cho một thành phần JavaBeans A có thuộc tính size. Mỗi khi size thay đổi nó sẽ thơng báo cho các thành phần khác biết thông qua đối tượng listener. Chương trình tạo thành phần JavaBeans có thuộc tính thay đổi.
Ví dụ 2-1:
import java.util.*; import java.beans.*;
public class A {
//ChangeAgent có nhiệm vụ quản lý tất cả các đối tượng listener đã //đăng ký
protected propertyChangeSupport changeAgent=new propertyChangeSupport (this);
//Biến lưu giữ thuộc tính size private int size=0;
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 100 //phương thức getter dùng để lấy giá trị thuộc tính size
public int getSize(){ return size;
}
//Phương thức setter dùng để gán giá trị cho thuộc tính size. public void setSize(int newSize){
int oldSize=size;
//Thông báo đến tát cả các đối tương listener là thuộc tính size thay đổi try {
changeAgent.firePropertyChange(“size”, new Integer(oldSize), new Integer(newSize)); }catch (PropertyChangeException e){
//Đối tượng listener khơng cho thay đổi thuộc tính System.out.println(“listener reject”);
return; }
/*
Khơng có sự ngăn cản nào từ phí listener, phương thức size thay đổi giá trị mới
*/
size=newSize; }
//Phương thức này dùng để đăng ký các đối tượng listener public void addSizeListener(
PropertyChangeListener lsn){ changeAgent.addPropertyChangeListener(lsn); }
//Phương thức này dùng để loại bỏ đối tượng listener đã đăng ký public void removeSizeListener(
PropertyChangeListener lsn){
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 101
}
}
Ví dụ sau sẽ sử dụng thành phàn JavaBean A và cài đặt đối tượng listener cho thuộc tính size. Chương trình sử dụng JavaBeans có thuộc tính thay đổi
Ví dụ 2-2:
import java.util.*; import java.beans.*;
public class useBeanA {
public static void main(String args[]){ //Tạo thành phần JavaBeans
A bean=new A();
//Đăng ký đối tượng biết lắng nghe sự thay đổi thuộc tính size bean.addSizeListener(new myListenerA());
//Thuộc tính size bị thay đổi bean.setSize(10);
System.out.println("> size after setting " +bean.getSize()); bean.setSize(130);
System.out.println("> size after setting " +bean.getSize()); bean.setSize(500);
System.out.println("> size after setting " +bean.getSize()); bean.setSize(96);
System.out.println("> size after setting " +bean.getSize()); }
}
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 102 class myListenerA implements PropertyChangeListener {
//Phương thức này sẽ nhận biết sự thay đổi của thuộc tính public void propertyChange(
PropertyChangeEvent evt)
throws PropertyChangeException {
Integer newVal=(Integer)evt.getNewValue(); Integer oldVal=(Integer)evt.getOldValue(); String propName= evt.getPropertyName();
//Kiểm tra nếu giá trị của thuộc tính lớn hơn 100 thì khơng cho thay đổi if (newVal.intValue()>100) {
throw (new PropertyVetoException( "Value greater than 100",evt)); }
System.out.println(" change "+propName + " from "+oldVal.intValue() + " to "+newVal.intValue()); }
}