Gới thiệu cơ chế ảo và trừu tượng
3.3. Xử lý các sự kiện
Các hệ thống GUI xử lý các tương tác người dùng với sự trợ giúp của mô hình hướng sự kiện (Event - Driven). Tương tác của người dùng có thể là di chuyển chuột, nhấn phím, nhả phím v.v…Tất cả các thao tác này thiết lập một sự kiện của một loại nào đó.
Việc xử lý những sự kiện này phụ thuộc vào ứng dụng. Abstract Windowing Toolkit (AWT) xử lý một vài sự kiện. Môi trường mà các ứng dụng này được thi hành ví dụ như trình duyệt cũng có thể xử lý các sự kiện khác. Người lập trình cũng cần phải xử lý những sự kiện nhất định và cần phải viết hàm xử lý các sự kiện đó.
a) Mô hình xử lý sự kiện (Event-Handling Model)
Những sự kiện được phát sinh khi người dùng tương tác với giao diện chương trình (GUI). Những tương tác thường gặp như: di chuyển, nhấn chuột, nhấn một nút nhấn, chọn một MenuItem trong hệ thống thực đơn, nhập dữ liệu trong một ô văn bản, đóng cửa sổ ứng dụng, … Khi có một tương tác xảy ra thì một sự kiện được gởi đến chương trình. Thông tin về sự kiện thường được lưu trữ trong một đối tượng dẫn xuất từ lớp AWTEvent. Những kiểu sự kiện trong gói java.awt.event có thể dùng cho cả những component AWT và JFC. Đối với thư viện JFC thì có thêm những kiểu sự kiện mới trong gói java.swing.event.
Có 3 yếu tố quan trọng trong mô hình xử lý sự kiện:
Nguồn phát sinh sự kiện (event source): là thành phần của giao diện mà người dùng tác động.
Sự kiện (event object): Tóm tắt thông tin về xử kiện xảy ra, bao gồm tham chiếu đến nguồn gốc phát sinh sự kiện và thông tin sự kiện sẽ gởi đến cho bộ lắng nghe xử lý.
Bộ lắng nghe sự kiện (event listener): Một bộ lắng nghe là một đối tượng của một lớp hiện thực một hay nhiều interface của gói
java.awt.event hay java.swing.event (đối với những component trong thư viện JFC). Khi được thông báo, bộ lắng nghe nhận sự kiện và xử lý.
Nguồn phát sinh sự kiện phải cung cấp những phương thức để đăng ký hoặc hủy bỏ một bộ lắng nghe. Nguồn phát sinh sự kiện luôn phải gắn với một bộ lắng nghe, và nó sẽ thông báo với bộ lắng nghe đó khi có sự kiện phát sinh đó.
Một Event Listener lắng nghe một sự kiện nào đó mà một đối tượng đã thiết lập. Mỗi event listener cung cấp các phương thức xử lý những sự kiện này. Lớp thi hành listener cần phải định nghĩa những phương thức này. Để sử dụng mô hình này, bạn làm theo các bước sau:
Cài đặt giao diện listener thích hợp. Cấu trúc như sau:
public class MyApp extends Frame implements ActionListener
Xác định tất cả các thành phần tạo ra sự kiện. Các thành phần có thể là các button, label, menu item, hay window. Ví dụ, để đăng ký một thành phần với listener, ta có thể sử dụng:
Tên_biến_đối_tượng.exitbtn.addActionListener(this);
Xác định tất cả các sự kiện được xử lý. Các sự kiện có thể là một
‘ActionEvent’ nếu một button được click hay một ‘mouseEvent’ nếu như chuột được kéo đi.
Thi hành các phương thức của listener và viết hàm xử lý sự kiện tương ứng với các phương thức.
Một đối tượng Event-Listener lắng nghe những sự kiện khác nhau phát sinh từ các components của giao diện chương trình. Với mỗi sự kiện khác nhau phát sinh thì phương thức tương ứng trong những Event-Listener sẽ được gọi thực hiện. Mỗi interface Event-Listener gồm một hay nhiều các phương thức mà chúng cần cài đặt trong các lớp hiện thực (implements) interface đó. Những phương thức trong các interface là trừu tượng vì vậy lớp (bộ lắng nghe) nào hiện thực các interface thì phải cài đặt tất cả những phương thức đó. Nếu không thì các bộ lắng nghe sẽ trở thành các lớp trừu tượng.
Bảng sau đây chỉ ra các sự kiện khác nhau và mô tả về chúng:
Lớp sự kiện Mô tả
ActionEvent
Phát sinh khi một button được nhấn, một item trong danh sách chọn lựa được nhấn đúp (double-click) hay một menu được chọn.
AdjustmentEvent Phát sinh khi một thanh scrollbar được sử dụng.
ComponentEvent Phát sinh khi một thành phần được thay đổi kích thước, được
di chuyển, bị ẩn hay làm cho hoạt động được.
FocusEvent Phát sinh khi một thành phần mất/nhận focus từ bàn phím.
ItemEvent Phát sinh khi một mục menu được chọn hay bỏ chọn; hay khi
một checkbox hay một item trong danh sách được click.
WindowEvent Phát sinh khi một cửa sổ được kích hoạt, được đóng, được mở
hay thoát.
TextEvent Phát sinh khi giá trị trong thành phần textfield hay textarea bị
thay đổi.
MouseEvent Phát sinh khi chuột di chuyển, click, được kéo hay thả ra.
KeyEvent Phát sinh khi bàn phím ấn, nhả.
Bảng 7.3.2.4: Các sự kiện các đối tượng Các giao diện cần được cài đặt để xử lý một trong số những sự kiện này là:
ActionListener
AdjustmentListener
ComponentListener
FocusListener
ItemListener
WindowListener
TextListener
MouseListener
MouseMotionListener
KeyListener
b) Xử lý sự kiện chuột
Java cung cấp hai intefaces lắng nghe (bộ lắng nghe sự kiện chuột) là MouseListener và MouseMotionListener để quản lý và xử lý các sự kiện liên quan đến thiết bị chuột. Những sự kiện chuột có thể “bẫy” cho bất kỳ component nào trên GUI mà dẫn xuất từ java.awt.component.
Các phương thức của interface MouseListener:
public void mousePressed(MouseEvent event): được gọi khi một nút chuột được nhấnvà con trỏ chuột ở trên component.
public void mouseClicked(MouseEvent event): được gọi khi một nút chuột được nhấn và nhả trên component mà không di chuyển chuột.
public void mouseReleased(MouseEvent event): được gọi khi một nút chuột nhả sa khi kéo rê.
public void mouseEntered(MouseEvent event): được gọi khi con trỏ chuột vào trong đường biên của một component.
public void mouseExited(MouseEvent event): được gọi khi con trỏ chuột
ra khỏi đường biên của một component.
Các phương thức của interface MouseMotionListener:
public void mouseDragged(MouseEvent even ): phương thức này được gọi khi người dùng nhấn một nút chuột và kéo trên một component.
public void mouseMoved(MouseEvent event): phương thức này được gọi
khi di chuyển chuột trên component.
Mỗi phương thức xử lý sự kiện chuột có một tham số MouseEvent chứa thông tin về sự kiện chuột phát sinh chẳng hạn như: tọa độ x, y nơi sự kiện chuột xảy ra. Những phương thức tương ứng trong các interfaces sẽ tự động được gọi khi chuột tương tác với một component.
Để biết được người dùng đã nhấn nút chuột nào, chúng ta dùng những phuơng thức, những hằng số của lớp InputEvent (là lớp cha của lớp MouseEvent).
Ví dụ 7.3.2.17: Xử lý các sự kiện của đối tượng Mouse trên cửa sổ ứng dụng.
import java.awt.*;
import java.awt.event.*;
class MouseEventDemo01 extends Frame implements MouseListener,MouseMotionListener
{
private Label myLabel;
public MouseEventDemo01()
{
super("MouseEvent Test");
myLabel=new Label();
myLabel.setText("Mô phỏng các sự kiện của đối tượng Mouse");
this.setLayout(new FlowLayout());
this.add(myLabel);
addMouseListener(this);
addMouseMotionListener(this);
setSize(400,100);
setVisible(true);
}
public void mouseClicked(MouseEvent event)
{
myLabel.setText("Bạn vừa bấm chuột tại ("+event.getX()+","+event.getY()+")");
}
public void mousePressed(MouseEvent event)
{
myLabel.setText("Bấm chuột tại
("+event.getX()+","+event.getY()+")");
}
public void mouseReleased(MouseEvent e)
{
myLabel.setText("Nhả chuột tại ("+e.getX()+","+e.getY()+")");
}
public void mouseEntered (MouseEvent e)
{
myLabel.setText("Chuột bên trong cửa sổ");
}
public void mouseMoved (MouseEvent e)
{
myLabel.setText("Chuột di chuyển đến ("+e.getX()+","+e.getY()+")");
}
public void mouseDragged(MouseEvent e)
{
myLabel.setText("Kéo chuột tới ("+e.getX()+","+e.getY()+")"); }
public void mouseExited(MouseEvent event)
{
myLabel.setText("Chuột bên ngoài cửa sổ");
}
public static void main(String[] abc)
{
MouseEventDemo01 myMouse=new MouseEventDemo01();
myMouse.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
c) Xử lý sự kiện bàn phím
Để xử lý sự kiện bàn phím java hỗ trợ một bộ lắng nghe sự kiện đó là interface
KeyListener. Một sự kiện bàn phím đượcphát sinh khi người dùng nhấn và nhả một
phím trên bàn phím.
Một lớp hiện thực KeyListener phải cài đặt các phương thức keyPressed, keyReleased và keyTyped. Mỗi phương thức này có một tham số là một đối tượng
kiểu KeyEvent. KeyEvent là lớp con của lớp InputEvent.
Các phương thức của interface KeyListener
Phương thức keyPressed được gọi khi một phím bất kỳ được nhấn.
Phương thức keyTyped được gọi thực hiện khi người dùng nhấn một phím không phải “phím hành động” (như phím mũi tên, phím Home, End, PageUp, PageDown, các phím chức năng như: Num Lock, PrintScreen, ScrollLock, CapsLock, Pause).
Phương thức keyReleased được gọi thực hiện khi nhả phím nhấn sau khi
sự kiện keyPressed hoặc keyTyped.
Ví dụ 7.3.2.18: Xử lý các sự kiện bấm phím trên cửa sổ ứng dụng.
import java.awt.*;
import java.awt.event.*;
public class KeyEventDemo01 extends Frame implements KeyListener
{ TextField t1;
Label l1;
public KeyEventDemo01(String s )
{ super(s);
Panel p =new Panel();
l1 = new Label (" Chờ phím bấm! " ) ;
l1.setFont(new java.awt.Font("Times New Roman",1,16));
p.add(l1);
add(p);
addKeyListener ( this ) ;
setSize (400,200 );
setLocation(300,300);
setVisible(true);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
});
}
public void keyTyped ( KeyEvent e )
{ l1.setText("Bạn bấm phím: "+ e.getKeyChar());
}
public void keyPressed ( KeyEvent e){}
public void keyReleased ( KeyEvent e ){}
public static void main (String[]args )
{ new KeyEventDemo01 ("KeyListener Test" ) ;
}
}
Kết quả chương trình: