public void windowDeactivatedWindowEvent e {}} IV... addMouseListener new MouseAdapter { public void mouseClickedMouseEvent e // Mac dinh la chuot trai { // Kiem tra neu la chuot phai du
Trang 1Đ 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:ấ ỉ ự ế ừ ữ ớ ự ệ
Trang 2Cá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 đó.ự ệ
Trang 34 Đ 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:ơ ồ ạ ư
Trang 4Sau đâ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");
Trang 5JButton 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ị ớ ả ở ư ớ
Trang 6thành l p n i c a l p ButtonPanel, khi đó trong l p ColorAction, ta có th truy c p cácớ ộ ủ ớ ớ ể ậ
phương th c c a l p Panel (đứ ủ ớ ược ButtonPanel k th a) nh setBackground ch ng h n.ế ừ ư ẳ ạ
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); // Đăng ký b l ng nghe s ki nộ ắ ự ệ
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
private 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;
}
}
Chương trình sau đây ki m tra s th c hi n đáp ng các s ki n v a thi t k trên:ể ự ự ệ ứ ự ệ ừ ế ế ở
import javax.swing.JFrame;
public class testPanel extends JFrame
{
public testPanel() {
ButtonPanel pn = new ButtonPanel();
this.add(pn);
}
Trang 7public static void main(String[] argvs) {
testPanel p = new testPanel();
p.setSize(300,400);
p.setVisible(true);
} }
Thông thường, các l p l ng nghe s ki n có th đớ ắ ự ệ ể ược cài đ t ngay trong phặ ương th cứ addActionListener nh sau:ư
yellowButton.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
setBackground(Color.YELLOW);
}
});
Làm nh v y ta không c n thi t k riêng m t l p ColorAction.ư ậ ầ ế ế ộ ớ
II Truy c p thông tin s ki n ậ ự ệ
M t phộ ương pháp khác đ l p trình s ki n đó là gán cho t t c các đ i tể ậ ự ệ ấ ả ố ượng ngu nồ
s ki n chung m t đ i tự ệ ộ ố ượng l ng nghe Tùy theo thông tin v s ki n nh n đắ ề ự ệ ậ ược, phươ ng
th c actionPerformed s có s hành x khác nhau Mu n v y, l p ch a các ngu n s ki nứ ẽ ự ử ố ậ ớ ứ ồ ự ệ
ph i cài đ t giao di n ActionListener.ả ặ ệ
import javax.swing.*;
import java.awt.event.*;
public class ButtonPanel extends JPanel implements ActionListener
{ JButton yellowButton;
JButton blueButton;
JButton redButton;
public ButtonPanel()
{
yellowButton = new JButton("Yellow");
blueButton = new JButton("Blue");
redButton = new JButton("Red");
add(yellowButton);
add(blueButton);
add(redButton);
yellowButton.addActionListener(this);
blueButton.addActionListener(this);
redButton.addActionListener(this);
}
public void actionPerformed(ActionEvent event)
{
if (event.getSource()==yellowButton) setBackground(Color.YELLOW);
Trang 8if (event.getSource()==redButton) setBackground(Color.RED);
if (event.getSource()==blueButton) setBackground(Color.BLUE);
}
}
Trong ví d trên, b n thân l p component ButtonPanel đóng vai trò là l p l ng nghe sụ ả ớ ớ ắ ự
ki n vì nó có cài đ t giao di n ActionListener Do đó, khi đăng ký đ i tệ ặ ệ ố ượng l ng nghe cho cácắ Button, ta ch vi c s d ng bi n this, đ i di n cho đ i tỉ ệ ử ụ ế ạ ệ ố ượng ng m đ nh c a chính l pầ ị ủ ớ ButtonPanel Các đ i tố ượng Button bây gi cũng ph i khai báo là bi n thành ph n c a l p vìờ ả ế ầ ủ ớ chúng được truy c p trong 2 phậ ương th c khác nhau.ứ Tuy nhiên phương pháp này s tr nênẽ ở khó dùng khi trên panel có nhi u đ i tề ố ượng ngu n s ki n.ồ ự ệ
III X lý các s ki n trên window ử ự ệ
Ph n trên đã cho th y cách th c chúng ta làm vi c v i các ngu n s ki n là các đ iầ ấ ứ ệ ớ ồ ự ệ ố
tượng n m trong m t window Ph n này ta s xem xét các s ki n x y ra đ i v i b n thânằ ộ ầ ẽ ự ệ ả ố ớ ả
m t window.ộ
Mu n b t các s ki n c a window, ta cũng qua các bố ắ ự ệ ủ ước căn b n sau:ả
WindowListener listener = new
frame.addWindowListener(listener);
Trong đó frame là m t đ i tộ ố ượng c a l p JFrame, là đ i tủ ớ ố ượng ngu n s ki n phát sinhồ ự ệ các s ki n WindowEvent Đ i tự ệ ố ượng listener b t bu c ph i thu c m t l p có cài đ t giaoắ ộ ả ộ ộ ớ ặ
di n WindowListener C u trúc c a giao di n này nh sau:ệ ấ ủ ệ ư
public interface WindowListener
{
void windowOpened(WindowEvent e);
void windowClosing(WindowEvent e);
void windowClosed(WindowEvent e);
void windowIconified(WindowEvent e); // thu nh c a sỏ ủ ổ
void windowDeiconified(WindowEvent e);
void windowActivated(WindowEvent e);
void windowDeactivated(WindowEvent e);
}
Do đó các l p cài đ t giao di n này ph i khai báo đ nh nghĩa t t c các phớ ặ ệ ả ị ấ ả ương th cứ trên Tuy nhiên, ta ch vi t code cho phỉ ế ương th c nào ta x lý mà thôi, ví d :ứ ử ụ
class Terminator implements WindowListener
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
Trang 9public void windowDeactivated(WindowEvent e) {}
}
IV Các l p thích nghi ớ
Ta th y r ng vi c khai báo đ y đ 7 phấ ằ ệ ầ ủ ương th c, có nh ng phứ ữ ương th c không x lýứ ử
gì c làm cho chả ương trình không đượ ố ưc t i u Gi i pháp đây s là đ nh nghĩa m t l p trungả ở ẽ ị ộ ớ gian, khai báo cài đ t giao di n WindowListener v i đ y đ 7 phặ ệ ớ ầ ủ ương th c nh ng các phứ ư ươ ng
th c này cũng không làm gì c Các l p mu n cài đ t n i dung cho m t s ki n ch vi c khaiứ ả ớ ố ặ ộ ộ ự ệ ỉ ệ báo k th a l p này và đ nh nghĩa ch ng phế ừ ớ ị ồ ương th c c n thi t Các l p có vai trò trung gianứ ầ ế ớ
nh v y g i là các l p thích nghi V i m i giao di n l ng nghe, ta có m t l p thích nghi tư ậ ọ ớ ớ ỗ ệ ắ ộ ớ ươ ng
ng Ví d : WindowListener có l p thích nghi WindowAdapter, MouseListener có
MouseAdapter Các l p thích nghi thớ ường dùng là:
FocusAdapter MouseMotionAdapter
KeyAdapter WindowAdapter
MouseAdapter
class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
V n đ là các l p ấ ề ớ window thường ph i khai báo k th a t JFrame r i nên không thả ế ừ ừ ồ ể khai báo k th a thêm l p WindowAdapter Lúc này, k thu t đ nh nghĩa l p n i n c danhế ừ ớ ỹ ậ ị ớ ộ ặ
được phát huy:
frame.addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent event) {
System.exit(0);
} public void windowIconified(WindowEvent e) {System.exit(0);} } );
Đo n code này th c hi n các công vi c sau:ạ ự ệ ệ
1 Đ nh nghĩa m t class n c danh k th a l p WindowAdapterị ộ ặ ế ừ ớ
2 Thêm 2 phương th c windowClosing và windowIconified cho l p n c danh đóứ ớ ặ
3 K th a 5 phế ừ ương th c còn l i t WindowAdapterứ ạ ừ
4 T o ra m t đ i tạ ộ ố ượng c a l p đó, đ i tủ ớ ố ượng cũng không có tên
5 G i đ i tử ố ượng này cho phương th c addWindowListenerứ
Ta có th đ nh nghĩa ch ng nhi u h n m t phể ị ồ ề ơ ộ ương th c c a WindowAdapter ứ ủ
T t nhiên là không ph i khi nào ta cũng ph i s d ng l p n i n c danh M t cách làmấ ả ả ử ụ ớ ộ ặ ộ khác là khai báo m t l p (thộ ớ ường là l p n i) d ng nh class Terminator trên, sau đó đăng kýớ ộ ạ ư ở
l ng nghe s ki n cho frame mà không c n m t đ i tắ ự ệ ầ ộ ố ượng có tên rõ ràng c a Terminator:ủ
Trang 10frame.addWindowListener(new Terminator());
Đ k t thúc đ tài này ta li t kê các phể ế ề ệ ương th c x lý s ki n nh b ng sau:ứ ử ự ệ ư ả
Interface Methods Parameter/Accessors Ngu n s ồ ự
ki n ệ
ActionListener actionPerformed ActionEvent
• getActionCommand
• getModifiers
AbstractButton JComboBox JTextField Timer AdjustmentListener adjustmentvalueChanged AdjustmentEvent
• getAdjustable
• getAdjustmentType
• getValue
JScrollbar
ItemListener ItemstateChanged ItemEvent
• getItem
• getItemSelectable
• getStateChange
AbstractButton JComboBox
FocusListener FocusGained
• isTemporary
Component
KeyListener keyPressed
keyReleased keyTyped
KeyEvent
• getKeyChar
• getKeyCode
• getKeyModifiersText
• getKeyText
• isActionKey
Component
MouseListener mousePressed
mouseReleased mouseEntered mouseExited mouseClicked
MouseEvent
• getClickCount
• getX
• getY
• getPoint
• TRanslatePoint
Component
MouseMotionListener mouseDragged MouseEvent Component
Trang 11Interface Methods Parameter/Accessors Ngu n s ồ ự
ki n ệ
mouseMoved MouseWheelListener mousewheelMoved MouseWheelEvent
• getWheelRotation
• getScrollAmount
Component
WindowListener windowClosing
windowOpened windowIconified windowDeiconified windowClosed windowActivated windowDeactivated
WindowEvent
• getWindow
Window
WindowFocusListener windowGainedfocus
windowlostFocus
WindowEvent
• getOppositeWindow
Window
WindowStateListener WindowStateChanged WindowEvent
• getOldState
• getNewState
Window
V X lý các s ki n chu t ử ự ệ ộ
Các s ki n v i chu t đự ệ ớ ộ ược x lý b i giao di n MouseListener Khi m t ngu n sử ở ệ ộ ồ ự
ki n đệ ược kích ho t b i vi c click chu t, các phạ ở ệ ộ ương th c x lý cho các s ki n tứ ử ự ệ ương ngứ
được li t kê trong b ng trên, đ c bi t hay dùng là mouseClicked() Thông thệ ả ặ ệ ương ta cũng không cài đ t x lý cho t t c các s ki n này nên ta không cài đ t giao di n MouseListenerặ ử ấ ả ự ệ ặ ệ
mà khai báo m t l p n i n c danh k th a t l p thích nghi MouseAdapter.ộ ớ ộ ặ ế ừ ừ ớ
Gi s có m t đ i tả ử ộ ố ượng JFrame tên là frame, sau đây là m t ví d qu n lý s ki nộ ụ ả ự ệ click chu t trên nó:ộ
frame addMouseListener( new MouseAdapter()
{
public void mouseClicked(MouseEvent e) // Mac dinh la chuot trai
{ // Kiem tra neu la chuot phai duoc click
if( (e.getModifiers() & InputEvent.BUTTON3_MASK)== InputEvent.BUTTON3_MASK)
// hien thi mot popup menu tai vi tri click
jp.show(getContentPane(),e.getX(),e.getY());
}
} );