Đ tài 8. X lý các s ki n trong Javaề ử ự ệ
I. Khái ni m và c s x lý s ki nệ ơ ở ử ự ệ
B t kỳ ch ng trình có giao di n đ h a nào th ng h tr vi c kích ho t các s ki nấ ươ ệ ồ ọ ườ ỗ ợ ệ ạ ự ệ
t con chu t ho c bàn phím. Môi tr ng đi u hành s g i các s ki n này t i ch ng trìnhừ ộ ặ ườ ề ẽ ử ự ệ ớ ươ
đang ch y. L p trình viên đ c hoàn toàn quy t đ nh đi u gì s x y ra khi các s ki n nàyạ ậ ượ ế ị ề ẽ ả ự ệ
đ c kích ho t.ượ ạ
Trong Java s d ng m t cách ti p c n d a trên các khái ni m:ử ụ ộ ế ậ ự ệ
- Các ngu n c a s ki n (event source)ồ ủ ự ệ
- Các b l ng nghe s ki n (event listener)ộ ắ ự ệ
Các ngu n s ki n chính là các đ i t ng đi u khi n, chúng có các ph ng th c đồ ự ệ ố ượ ề ể ươ ứ ể
l p trình viên đăng ký các b l ng nghe cho chúng. Khi m t s ki n x y ra đ i v i m t ngu nậ ộ ắ ộ ự ệ ả ố ớ ộ ồ
s ki n, nó s g i thông báo này t i t t c các b l ng nghe s ki n đ c đăng ký cho sự ệ ẽ ử ớ ấ ả ộ ắ ự ệ ượ ự
ki n đó.ệ
Đ i v i m t ngôn ng OOP nh Java thì toàn b thông tin v s ki n đ c đóng góiố ớ ộ ữ ư ộ ề ự ệ ượ
trong m t l p event. T t c các l p event đ u d n xu t t l p java.util.EventObject. M i lo iộ ớ ấ ả ớ ề ẫ ấ ừ ớ ỗ ạ
s ki n t ng ng v i m t l p d n xu t, ch ng h n nh ActionEvent và WindowEvent. Sauự ệ ươ ứ ớ ộ ớ ẫ ấ ẳ ạ ư
đây là cây phân c p ch s k th a gi a các l p s ki n trong Java:ấ ỉ ự ế ừ ữ ớ ự ệ
96
Các s ki n trên đ c g i cho các đ i t ng l ng nghe t ng ng nh : ActionListenerự ệ ượ ử ố ượ ắ ươ ứ ư
MouseMotionListener
AdjustmentListener MouseWheelListener
FocusListener WindowListener
ItemListener WindowFocusListener
KeyListener WindowStateListener
MouseListener
Các ngu n s ki n khác nhau có th phát sinh các s ki n khác nhau. Ví d m t buttonồ ự ệ ể ự ệ ụ ộ
(nút b m) thì phát sinh s ki n ActionEvent trong khi m t c a s l i phát sinh s ki nấ ự ệ ộ ử ổ ạ ự ệ
WindowEvent.
Tóm l i, m t s ki n đ c qu n lý d a trên các khái ni m:ạ ộ ự ệ ượ ả ự ệ
1. M t đ i t ng l ng nghe là m t bi u hi n c a m t l p có cài đ t giao di nộ ố ượ ắ ộ ể ệ ủ ộ ớ ặ ệ
l ng nghe s ki nắ ự ệ
2. M t ngu n s ki n là m t đ i t ng mà có th đăng ký các đ i t ng l ngộ ồ ự ệ ộ ố ượ ể ố ượ ắ
nghe và g i cho chúng các đ i t ng s ki n.ử ố ượ ự ệ
3. Ngu n s ki n g i đ i t ng s ki n t i t t c các đ i t ng l ng nghe đ cồ ự ệ ử ố ượ ự ệ ớ ấ ả ố ượ ắ ượ
đăng ký cho s ki n đó.ự ệ
97
4. Đ i t ng l ng nghe s s d ng thông tin trong các đ i t ng s ki n đ ph nố ượ ắ ẽ ử ụ ố ượ ự ệ ể ả
ng v i các s ki n đó.ứ ớ ự ệ
Cú pháp đ đăng ký các đ i t ng l ng nghe cho các ngu n s ki n theo cú pháp sau:ể ố ượ ắ ồ ự ệ
<ngu n s ki n>.add<s ki n>Listener(<ồ ự ệ ự ệ đ i t ng l ng nghe s ki nố ượ ắ ự ệ >)
Ví d :ụ
ActionListener listener = . . .; // đ i t ng l ng ngheố ượ ắ
JButton button = new JButton("Ok"); // Ngu n s ki nồ ự ệ
button.addActionListener(listener); // đăng ký đ i t ng l ng nghe s ki nố ượ ắ ự ệ
Trong đo n code trên, v n đ còn l i là đ i t ng l ng nghe s ki n ph i có m tạ ấ ề ạ ố ượ ắ ự ệ ả ộ
ph ng th c đ nh n v s ki n t ngu n s ki n đăng ký nó và x lý. ươ ứ ể ậ ề ự ệ ừ ồ ự ệ ử đây, Ở đ i t ngố ượ
listener ph i thu c m t l p có cài đ t giao di n ActionListener. Trong giao di n này có khaiả ộ ộ ớ ặ ệ ệ
báo m t ph ng th c actionPerformed đ nh n v m t s ki n ActionEvent:ộ ươ ứ ể ậ ề ộ ự ệ
class MyListener implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
// Đo n mã x ký s ki n đ t đâyạ ử ự ệ ặ ở
. . .
}
}
B t c khi nào ng i dùng click chu t vào đ i t ng Jbutton trên màn hình, m t sấ ứ ườ ộ ố ượ ộ ự
ki n ActionEvent đ c phát sinh và g i cho đ i t ng l ng nghe listener. Đ i t ng này cóệ ượ ử ố ượ ắ ố ượ
cài đ t m t ph ng th c đ x lý s ki n là actionPerformed, l y đ i s là đ i t ngặ ộ ươ ứ ể ử ự ệ ấ ố ố ố ượ
ActionEvent nh n đ c.ậ ượ
Có th có nhi u b l ng nghe đ c đăng ký cho m t ngu n s ki n, khi đó s ki nể ề ộ ắ ượ ộ ồ ự ệ ự ệ
cũng đ c g i t i t t c các b l ng nghe và t i ph ng th c actionPerformed c a chúng.ượ ử ớ ấ ả ộ ắ ớ ươ ứ ủ
S đ sequence cho đo n code trên nh sau:ơ ồ ạ ư
98
Sau đây là m t ví d v x lý s ki n click cho 3 đ i t ng Jbutton:ộ ụ ề ử ự ệ ố ượ
M t Button đ c t o ra nh sau b ng cách g i constructor c a JButton v i m t chu iộ ượ ạ ư ằ ọ ủ ớ ộ ỗ
nhãn ho c m t nh hay c hai:ặ ộ ả ả
JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton(new ImageIcon("blue-ball.gif"));
Thêm 3 Button vào 1 panel nh sau:ư
Class ButtonPanel extends JPanel
{
public ButtonPanel()
{
JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton("Blue");
99
JButton redButton = new JButton("Red");
add(yellowButton);
add(blueButton);
add(redButton);
}
}
Bây gi chúng ta đ nh nghĩacác b l ng nghe cho các Button này g i là ColorAction nhờ ị ộ ắ ọ ư
sau:
public class ColorAction implements ActionListener
{
public ColorAction(Color c)
{
backgroundColor =c;
}
public void actionPerformed(ActionEvent e)
{
setBackground(backgroundColor); // Thay đ i màu n n c a panel khi Button đ cổ ề ủ ượ
click
}
private Color backgroundColor;
}
M i đ i tỗ ố ượng Button đ c đăng ký cho b l ng nghe này:ượ ộ ắ
Class ButtonPanel extends JPanel
{
public ButtonPanel()
{
JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton("Blue");
JButton redButton = new JButton("Red");
add(yellowButton);
add(blueButton);
add(redButton);
ColorAction yellowAction = new ColorAction(Color.Yellow);
ColorAction blueAction = new ColorAction(Color.Blue);
ColorAction redAction = new ColorAction(Color.Red);
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
}
M t v n đ đ t ra là ph ng th c setBackground() không đ c đ nh nghĩa trong l pộ ấ ề ặ ươ ứ ượ ị ớ
ColorAction mà ch đ c đ nh nghĩa cho l p Panel. Gi i pháp đây là đ a l p ColorActionỉ ượ ị ớ ả ở ư ớ
100