Các tình huống nội tại (Event state)

Một phần của tài liệu PHÁT TRIỂN PHẦN MỀM THEO HƯỚNG CẤU PHẦN (Trang 109)

b. Trình khách Globe.

3.1Các tình huống nội tại (Event state)

Một thành phần JavaBeans ngoài việc gửi tình huống đến những đối tượng khác còn phải lo xử lý những tình huông mà bản thân hệ thống gửi đến mình. Chẳng hạn, nếu thiết kế thành phần JavaBeans thể hiện một nút nhấn có hình ảnh , ta phải xử lý được các tình huống xảy ra khi người dùng bấm chuột hay nhấn bàn phím để vẽ lại hình ảnh ở những trạng thái sao cho thích hợp như: Khi nút bị nhấn xuống, nút trở về trạng thái bình thường hay khi người dùng chuyển qua nút khác…

Nếu xét về vai trò thì bản thân hệ thống là nơi phát sinh tình huống (event source) còn thành phần JavaBeans phải tiếp nhận và xử lý những tình huống này.

Để nhận biết được tình huống mà hệ thống đưa đến, thành phần JavaBeans phải xây dựng một đối tượng listener và đăng ký đối tượng này với hệ thống. Các đối tượng listener được tạo từ những giao diện mà đã thiết kế sẵn dành cho từng tình huống cụ thể như sau:

Bài giảng COP – Chuyên ngành: CNPM - Version 1

Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 110 ComponentListener Listner dùng để nhận biết các tình huống khi đối tượng bị thay đổi kích thước (resize), di chuyển (move), hiển thị (show) hay ẩn đi (hide)

FocusListener Listner nhận biết tình huống Focus (là tình huống mà đối tượng nhận dược nhiều quyền ưu tiên nhất).

KeyListener Listner nhận biết các tình huống xuất phát từ bàn phím. MouseListener Listner nhận biết các tình huống xuất phát từ việc bấm chuột như kích chuột phải, kích chuột trái, kích đôi.

MouseMotionListener Listner nhận biết tình huống di chuyển chuột W indowListener Listner nhận biết tình huống một cửa sổ bị đóng lại, mở ra, thu nhỏ thành biểu tượng…

ActionListener Listner nhận biết tình huống mà đối tượng sẽ phải thực thi một tác vụ nào đó.

AdjustmentListener Listner nhận biết tình huốngmà đối tượng thay đổi giá trị (như vị trí thành trượt cảu thành phần Scronllbar chẳng hạn)

ItemListener Listner nhận biết tình huống mà một phần tử thay đổi trạng thái (như trong các thành phần checkbox, choice…)

Có hai cách để tạo đối tượng listener giúp thành phần JavaBeans tiếp nhận được tình huống mà hệ thống đưa đến, cách thứ nhất là tạo ra một đối tượng listener riêng biệt, sau đó thành phần JavaBeans sẽ đăng ký với hệ thống đối tượng listener này, cách thứ hia là dùng chính bản thân thành phần JavaBeans cài đặt cho các giao diện listener và đăng ký với hệ thông thông qua biến this. Ví dụ hai cách đăng đăng ký đối tượng listener để xử lý tình huống chuột sau đây cho thàn phần JavaBeans là như nhau:

Cách 1:

public class BeansTexst extends Panel { addMouseListener (new myListener()); }

class myListener implements MouseListener{ public void mouseClicked(MouseEvent e) { system.out.println (“Mouse click”);

}

Bài giảng COP – Chuyên ngành: CNPM - Version 1

Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 111 }

public void mouseReleased(MouseEvent e){ }

public void mouseEntered(MouseEvent e){ }

public void mouseExited(MouseEvent e){ }

} Cách 2:

public class BeansTexst extends Panel implements MouseListener{

addMouseListener(this);

public void mouseClicked(MouseEvent e) { system.out.println (“Mouse click”);

}

public void mousePressed(MouseEvent e){ }

public void mouseReleased(MouseEvent e){ }

public void mouseEntered(MouseEvent e){ }

public void mouseExited(MouseEvent e){ }

}

Thông thường sử dụng cách thứ hai thuận tiện hơn. Mặc dù vậy cách thứ nhất sẽ được áp dụng cho trường hợp:

Ở đoạn chương trình trên có những tình huống ta chưa cần xử lý đến như

mouseReleased, mousePressed, mouseEntered hay mouseExited nhưng vẫn phải thực hiện cài đặt, bởi vì theo nguyên tắc để sử dụng được một lớp giao diện (interface) thì tất cả các phương thức đối với các phương thức chưa sử dụng thì để trống ko làm gì cả. Cách thiết kế này tỏ ra không gọn gàng cho lắm. Các nhà phát triển Java đã nhận ra điều này và thực hiện một giải pháp khác đơn giản

Bài giảng COP – Chuyên ngành: CNPM - Version 1

Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 112

hơn, đó là tạo ra một lớp trừu tượng (abstract class) cài đặt cho từng giao diện tình huống cụ thể. Tuy nhiên, trong lớp trừu tượng này các phương thức cài đặt được để trống (tương tự như đã làm ở đoạn chương trình trên) các lớp xử lý tình huống trừu tượng này được gọi là EventAdapter. Ví dụ lớp MouseAdapter thực hiện được thiết kế như sau:

public abstract class MouseAdapter implements MouseListener{

public void mouseClicked(MouseEvent e) { }

public void mousePressed(MouseEvent e){ }

public void mouseReleased(MouseEvent e){ }

public void mouseEntered(MouseEvent e){ }

public void mouseExited(MouseEvent e){ }

}

Tương ứng với các giao diện xử lý tình huống listener ta có các lớp Adapter như sau:

ComponentListener ComponentAdapter FocusListener FocusAdapter KeyListener KeyAdapter MouseListener MouseAdapter MouseMotionListener MouseMotionAdapter W indowListener W indowAdapter

Khi có nhu cầu tạo ra đối tượng listener ta chỉ việc dẫn xuất từ các lớp Adapter này và cài đặt cho những phương thức xử lý tình huống cần thiết mà thôi. Ở đây nếu lưu ý ta sẽ thấy các lớp giao diện ActionListener, AdjustmentListener, ItemListener không được thiết kế lớp Adapter tương ứng, lý do là bản thân các lớp giao diện này chỉ cần cài đặt cho một phương thức duy nhất nên không cần thiết phai tạo ra một lớp Adapter khác (bởi vì mục đích của

Bài giảng COP – Chuyên ngành: CNPM - Version 1

Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 113

các lớp Adapter chỉ dùng để hạn chế việc phải cài đặt quá nhiều các phương thưucs trong lớp giao diện ).

Các lớp Adapter tuy mang tính trừu tượng nhưng là các lớp cụ thể (chứ không phải là lớp giao diện), chính vì vậy ta không thể tạo đối tượng listener theo 2 cách như ví dụ đã nêu ở phần trên được. Dưới đây ta sẽ viết lại đoạn mã xử lý các tình huống chuột, cho thành phần JavaBeans bằng đối tượng listener (sử dụng lớp MouseAdapter):

public class BeansTest extends Panel { addMouseListener (new myListener()); }

class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e) { system.out.println (“Mouse click”);

} }

Như vậy chỉ cần cài đặt cho một phương thức duy nhất là mouseClicked mà ta cần sử dụng từ lớp MouseAdapter, các phương thức sử lý chuột khác không cần phải quan tâm đến vì đã được lớp MouseAdapter thiết kế để trống

Tóm lại ta sử dụng các lớp Adapte khi yêu cầu chỉ cần xử lý một vài tình huống, còn khi phải xử lý nhiều tình huống thì nên dùng đến lớp giao diện listener. Lớp giao diện listener được xử dụng bằng cách cài đặt cho tất cả các phương thức của lớp (nếu phương thức nào không dùng thì để trông), còn lớp Adapter được sử dụng bằng cách tạo ra một lớp con cụ thể khác và chỉ cần cài đặt cho phương thức xử lý tình huống nào thấy cần thiết mà thôi

Lưu ý: Cách xử lý tình huống này không những chỉ được áp dung cho tiêng thành phần JavaBeans mà nó còn được coi là mô hình xử lý tình huống chủ yếu của hệ thống Java (từ Java 1.1 trở đi) . Do đó, ta cũng có thể áp dụng cách xử lý tình huống này cho mọi thành phần đồ họa khác(các thành phần component của thư viện awt).

Một phần của tài liệu PHÁT TRIỂN PHẦN MỀM THEO HƯỚNG CẤU PHẦN (Trang 109)