b. Trình khách Globe.
3.3 Đăng ký đối tượng listener với thành phần JavaBeans
Để các thành phần khác có thể đăng ký được đối tượng listener với thành phần JavaBeans bản thân thành phần JavaBeans phải cài đặt hai phương thức theo mẫu (pattern) sau:
public synchronized void add<Eventlistener> ( <Eventlistener> 1 )
public synchronized void remove<Eventlistener> ( <Eventlistener> 1 )
Ví dụ để các thành phần khác có thể đăng ký đối tượng listener cho tình huống nhấn chuột thì thành phần JavaBeans sẽ phải cài đặt hai phương thức dùng để đăng ký như sau:
public synchronized void addMouseListener (
MouseListener 1 )
public synchronized void removeMouseListener (
MouseListener 1 )
Thành phần JavaBeans cần lưu lại các listener đã được đăng ký trước đó. Khi muốn chuyển giao tình huống, JavaBeans sẽ gọi đến từng phương thức tương ứng của những listener này. Nếu có nhiều listener cùng đăng ký thì đối tượng listener thường được lưu lại bằng lớp Vector như sau:
Vector saveListeners=new Vector ( );
public synchronized void addMouseListener (
MouseListener 1) {
// Đưa các đối tượng listener vào danh sách lưu giữ if ( ! saveListeners.contains (1)) {
saveListeners.addElement (1); }
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 115 public synchronized void removeMouseListener (
MouseListener 1) {
// Loại bỏ đối tượng listener ra khỏi danh sách if (saveListeners != null
&& saveListener.contains (1) ) { saveListener.removeElement (1) ; }
}
Khi thành phần JavaBeans muốn thông báo đến các đối tượng listener là có một tình huống xảy ra JavaBeans sẽ duyệt từ đầu đến cuối danh sách các đối tượng listener được đăng ký trước đó và gọi phương thức tương ứng mà đối tượng listener đã cài đặt.
Dưới đây là một ví dụ minh họa, ta xây dựng thành phần JavaBeans có khả năng tiếp nhận các đối tượng listener dùng để xử lý tình huống nhấn chuột.
Ví dụ 2-5: MouseBean.Java
import java.beans.*; import java.awt.*; import java.awt.event.*; import java.util.*;
public class MouseBean extends Panel implements MouseListener { Vector saveListeners = new Vector ( ); public MouseBean ( ) {
// Tạo listener để MouseBean có thể tiếp nhận được các tình // huống chuột của hệ thống
super.addMouseListener (this); }
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 116 Phương thức này dùng để các thành phần khác đăng ký đối tượng listener với thành phần MouseBean
*/
public synchronized void addMouseListener ( MouseListener 1) { if ( !saveListeners.contains (1) ) { saveListeners.addElement (1); } } /*
Phương thức này dùng để các thành phần khác loại bỏ đối tượng listener đã đăng ký với thành phần MouseBean trước đó
*/
public synchronized void removeMouseListener (
MouseListener 1) { if ( saveListeners != null && saveListeners.contains (1) ) { saveListeners.removeElement (1); } } /*
Khi nhận được tình huống kích chuột (mouseClick) từ hệ thống ta sẽ gửi đến các đối tượng listener một tình huống khác đó là tình huống nhấn chuột (mousePressed). Tình huống kích chuột bao gồm 2 tình huống liên tiếp đó là nút được nhấn xuống (pressed) và thả ra (released) trong một khoảng thời gian nhất định
*/
public voidmouseClicked (MouseEvent e) {
system.out.println ( “ javaBeans mouse click event “ );
/*
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 117 Có thể dùng đối tượng MouseEvent e để lấy các thông tin hiện tại về chuột */
//… /*
Thông báo cho các đối tượng listener biết có một tình huống chuột xảy ra tình huống chuột mà các listener được thông báo ở đây là mousePressed
*/
if (saveListener != null) {
int count = saveListeners.size ( ) ; for ( int i = 0; i< count; i++) (( MouseListener) saveListeners.
elementAt (i) ).mousePressed (e); }
}
// Tình huống nhấn nút chuột do hệ thống gửi đến
public void mousePressed ( MouseEvent e) {
System.out.println ( “ JavaBeans mousePressed “) ; }
// Tình huống thả nút chuột do hệ thống gửi đến public void mouseReleased ( MouseEvent e ) {
System.out.println ( “ JavaBeans mouseReleased “ ); }
// Tình huống này chưa cần dùng đến
public void mouseEntered ( MouseEvent e) { }
// Tình huống này chưa cần dùng đến public void mouseExited ( MouseEvent e) { }
// Vẽ một hình oval cho thành phần MouseBean public void paint ( Graphics g) {
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 118 int h=getSize ( ).height;
int w=getSize ( ).width; g.setColor ( Color.yellow); g.fillOval ( 0, 0, w, h ); g.setColor ( Color.black);
g.drawString ( “ Event listener testing “, 10, h/2);} }
Biên dịch:
C:\ Learning>javac MouseBean.java
Sau khi biên dịch chương trình ta thu được lớp MouseBean.class. Dưới đây là một Applet sử dụng thành phần MouseBean. Có hai listener là mouseListener1 và mouseListener2 được đăng ký với thành phần MouseBean để phản ứng lại với tình huống mousePressed do MouseBean gửi đến.
Ví dụ 2-6: useMouseBean.java
import java.applet.*; import java.awt.*; import java.awt.event.*;
public class useMouseBean extends Applet { public void init ( ) {
// Chọn cách trình bày BorderLayout setLayout ( new BorderLayout ( ) ); // Tạo đối tượng MouseBean
MouseBean mb=new MouseBean ( ); /*
Đăng ký 2 đối tượng listener để đón bắt tình huống do MouseBean gửi đến */
mb.addMouseListener ( new mouseLisener1 ( ) ) ; mb.addMouseListener ( new mouseLisener2 ( ) ) ; // Đưa đối tượng MouseBean vào Applet
aad ( “ center “, mb); }
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 119 // Thiết kế đối tượng listener thứ nhất
class mouseListener1 extends MouseAdapter {
public void mousePressed ( MouseEvent e) { System.out.println ( “mouseListener 1 received
mousePressed Event “ );
} }
// Thiết kế đối tượng listener thứ hai
class mouseListener2 extends MouseAdapter { public void mousePressed ( MouseEvent e) { System.out.println ( “mouseListener 2 received
mousePressed Event “ );
} }
Biên dịch:
C:\Learning>java useMouseBean.java Sửa đổi tập tin MyApplet.html:
< APPLET CODE = “useMouseBean.class”
WIDTH=200 HEIGHT = 200>
Chạy chương trình:
C:\Learning>appletViewer MyApplet.html
Kích chuột vào vòng tròn trên Applet ta sẽ được kết quả trả về in ra cửa sổ Commond. Quan sát kết quả sẽ thấy khi kích chuột, bản thân thành phần MouseBean xảy ra 3 tình huống: mousePressed mouseRelease và cuối cùng mới đến mouseClick. Trong tình huống mouseClick thành phần MouseBean đã đánh lừa các listener bằng cách gửi dến các listener một tình huống khác là mousePressed và hai đối tượng mouseListener1, mouseListener2 đã nhận được tình huống này.