Event Handle là những phương thức được dùng để xử lý khi các sự kiện tương ứng với chúng xảy ra, có tác dụng phản hồi những thao tác của người dùng.. public void actionPerformedActionEve
Trang 1AWT Events
AWT Events 1
1 Giới thiệu 1
2 Các bước để bắt và xử lý một Event 3
3 Adapter 5
4 Các loại sự kiện của AWT 6
1 Giới thiệu 1.1 Event Khi dùng GUI, người dùng luôn phải nhấn chuột hoặc gõ phím lên các control Mỗi thao tác như vậy của người dùng sẽ tạo một sự kiện – event Trong phần này, chúng ta sẽ tìm hiểu về cách nắm bắt và xử lý cho các event trong Java Event là các đối tượng mô tả những sự kiện đang xảy ra trong AWT Sự kiện xảy ra khi người dùng thực hiện một động tác nào đó, như nhấn chuột, gõ phím,
Event Source là nơi xảy ra Event Ví dụ như người dùng nhấn chuột vào một Button thì Button đó là nơi xảy ra Event.
Event Handle là những phương thức được dùng để xử lý khi các sự kiện tương ứng với chúng xảy ra, có tác dụng phản hồi những thao tác của người dùng
1.2 Cách tổ chức event trong AWT
Trong AWT, các interface và class xử lý sự kiện được đặt trong một package con có tên
là event Do đó, để có thể xử lý sự kiện, ta cần import package này vào:
import java.awt.event.*;
Các loại Event trong AWT được tổ chức theo sơ đồ như sau:
Trang 2Hình 1: Sơ đồ event trong AWT
Ứng với mỗi loại event sẽ có một interface gọi là listener (và thường có một abstract class gọi là adapter đi kèm) Để dễ nhớ, trong Java chúng được đặt tên theo quy tắc sau: interface sẽ có dạng LoaiEvent Listener, còn abstract class tương ứng sẽ có dạng
LoaiEvent Adapter
Dưới đây là danh sách các loại Event:
Action ActionListener actionPerformed(ActionEvent)
Item ItemListener itemStateChanged(ItemEvent)
Mouse MouseListener
mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) Mouse Motion MouseMotionListener mouseDragged(MouseEvent) mouseMoved(MouseEvent)
Key KeyListener keyPressed(KeyEvent) keyReleased(KeyEvent)
keyTyped(KeyEvent) Focus FocusListener focusGained(FocusEvent)
java.util.EventObject
ActionEvent
java.awt.AWTEvent
AdjustmentEvent ComponentEvent
WindowEvent ContainerEvent InputEvent FocusEvent
KeyEvent MouseEvent java.awt.event
Trang 3Loại Tên interface Các phương thức
focusLost(FocusEvent) Adjustment AdjustmentListener adjustmentValueChanged(AdjustmentEvent) Component ComponentListener
componentMoved(ComponentEvent) componentHidden(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent)
Window WindowListener
windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) Container ContainerListener componentAdded(ContainerEvent) componentRemoved(ContainerEvent)
Text TextListener textValueChanged(TextEvent)
Bảng 1: Danh sách các event trong AWT
2 Các bước để bắt và xử lý một Event
2.1 Tổng quát
Để xử lý cho các Event, ta có thể làm theo các bước tổng quát như sau:
Tạo class xử lý cho loại sự kiện cần bắt Class này sẽ implement từ các interface listener hoặc extends từ các abstract class adapter có sẵn ứng với từng loại event Trong class này ta sẽ hiện thực (các) phương thức xử lý cho từng sự kiện Lớp này có thể là lớp thông thường hoặc lớp nội (có tên hoặc không tên)
Tạo một đối tượng thuộc class này và đăng ký nó vào (các) control cần xử lý cho
addLoaiEventListener(LoaiEventListener e).
Nếu muốn nhiều control cùng xử lý như nhau với một sự kiện, ta có thể tạo một đối tượng xử lý sự kiện dùng chung cho chúng
Thông thường, ta thường tạo các class sự kiện dưới dạng lớp nội (inner class) của Container chứa các control cần bắt sự kiện.
2.2 Ví dụ
Để xử lý cho sự kiện "Action" (là sự kiện xảy ra khi user click lên Button, MenuItem hoặc nhấn phím ENTER khi đang ở trong TextField), ta làm như sau:
Tạo class MyAction để xử lý cho sự kiện Action Class này sẽ implement từ interface ActionListener và hiện thực phương thức duy nhất actionPerformed(ActionEvent e) của interface này.
class MyAction implements ActionListener
Trang 4public void actionPerformed(ActionEvent e)
{
// Xử lý cho sự kiện này
}
}
Tạo đối tượng thuộc class này và thêm vào một Button có tên là bt:
bt.addActionListener(new MyAction()); // Cho bt xử lý sự kiện Action
Nếu muốn các control khác cùng xử lý như Button bt khi xảy ra sự kiện Action: MyAction ma = new MyAction(); // Tạo đối tượng MyAction
bt.addActionListener(ma); // Cho Button bt xử lý sự kiện Action
tf.addActionListener(ma); // Cho TextField tf xử lý sự kiện Action
Khi đó, nếu người dùng click lên Button bt hoặc nhấn ENTER khi đang ở trên TextField
tf, phương thức actionPerformed sẽ được Java gọi thực thi sự kiện Action đã được bắt và xử lý
Đoạn code hoàn chỉnh như sau:
import java.awt.*;
import java.awt.event.*;
public class Dialog03 extends Dialog
{
private Button bt=new Button ("Click here" );
private Label lb=new Label ("Hello AWT Events" );
public Dialog03(Frame frm)
{
super(frm, "Events Dialog" );
// Khởi tạo Dialog
this.setLayout(null);
this.setSize(300,150);
this.setLocation(150,250);
// Khởi tạo Label lb
lb.setSize(200,20);
lb.setLocation(50,60);
lb.setAlignment(Label.CENTER);
// Khởi tạo Button bt
bt.setSize(70,25);
bt.setLocation(115,100);
// Thêm sự kiện "action" cho Button bt
bt.addActionListener(new Dlg03OKEvent());
// Thêm bt và lb vào Dialog
this.add(lb);
this.add(bt);
}
Trang 5// Class xử lý cho sự kiện Action
class Dlg03OKEvent implements ActionListener
{
public void actionPerformed(ActionEvent e) {
lb.setText ("Button Clicked" );
} }
public static void main(String[]args)
{
Dialog03 dlg=new Dialog03(new Frame());
dlg.show();
}
}
2.3 Xử lý sự kiện với lớp nội không tên
Như ở trên, khi muốn xử lý một sự kiện ta phải tạo ra một class hoặc inner class dành cho
nó Việc này đôi khi trở nên phiền toái vì ít khi ta dùng lại các class đó Để công việc được thoải mái hơn, ta có thể dùng lớp nội không tên (anonymous inner class)
Cách dùng lớp nội không tên sẽ gọn gàng hơn so với các cáhc khác, nhưng nếu muốn cho nhiều control cùng xử lý như nhau với một sự kiện thì dùng lớp nội không tên sẽ không tốt như lớp nội có tên
Ví dụ: giả sử cần xử lý sự kiện action cho button tên là btOK
btOK.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// Xử lý ở đây
}
}
);
Trong ví dụ trên, khi gọi phương thức addActionListener(), ta cũng đồng thời tạo ra một lớp mới implement từ interface ActionListener, trong lớp này cài đặt phương thức actionPerformed() để xử lý sự kiện action Lớp nội được tạo ra như vậy không có tên.
3 Adapter
Như đã thấy, mỗi loại sự kiện đều có interface listener tương ứng Để bắt sự kiện thì ta phải tạo ra class implement từ các interface listener này Trong mỗi interface có nhiều phương thức cho từng sự kiện cụ thể Ví dụ, interface WindownListener có 7 phương thức để xử lý cho 7 sự kiện windowActivated, windowClosing, windowClosed, windowOpened,
Nếu ta chỉ cần quan tâm xử lý một hoặc vài sự kiện, thì ta vẫn phải hiện thực tất cả các phương thức ứng với các sự kiện khác của interface Ví dụ, ta chỉ muốn bắt sự kiện windowClosing nhưng vẫn phải định nghĩa cả windowActivated, windowClosed, (dưới dạng các phương thức rỗng) Điều này tốn công sức và dễ gây nhầm lẫn
Trang 6Để không phải hiện thực tất cả các phương thức của interface, Java cung cấp sẵn các adapter Các Adapter là những abstract class được implement từ những interface tương ứng Khi dùng adapter, ta sẽ tạo class extend từ chúng và chỉ cần định nghĩa lại những phương thức cần thiết cho (các) sự kiện đang được quan tâm Ví dụ, với WindowListener ta có WindowAdapter, với KeyListener ta có KeyAdapter,
Lưu ý: khi override phương thức bằng adaper, nếu gõ code sai (tên phương thức, tham số đầu vào, ) thì khi dịch sẽ không bị báo lỗi nhưng sự kiện sẽ không được xử lý
Ví dụ: thêm sự kiện đè chuột (mousePressed) lên nút btOK bằng cách kế thừa MouseAdapter (nếu implement từ MouseListener, ta phải cài đặt cả 5 phương thức do nó quy định)
Dùng inner class: tạo ra một lớp nội private
private class myMouseEven extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
// Xử lý ở đây
}
}
sau đó thêm vào btOK:
btOK.addMouseListener(new myMouseEven());
Dùng anonymous inner class:
btOK.addMouseListener
(
new MouseAdapter()
{
public void mousePressed(MouseEvent e) {
// Xử lý ở đây
} }
);
4 Các loại sự kiện của AWT
4.1 Sự kiện action
Như đã nói trên, loại sự kiện này được xảy ra khi người dùng nhấn vào Button, nhấn vào MenuItem hoặc gõ phím ENTER khi đang ở trong TextField.
Loại sự kiện này bao gồm:
Interface ActionListener: Chỉ có một phương thức actionPerformed
Class ActionEvent: Chứa thông tin cho sự kiện Action
ActionListener
Trang 7void actionPerformed(ActionEvent e) Được gọi tới khi xảy ra sự kiện action.
ActionEvent
long getWhen() Trả về thời điểm xảy ra sự kiện
Bảng 2: ActionListener và ActionEvent
Để đăng ký sự kiện Action cho control, ta dùng phương thức addActionListener()
4.2 Sự kiện window
Loại sự kiện này xảy ra khi có các tác động lên của sổ, như thu nhỏ, đóng, mở,
Loại sự kiện này bao gồm:
Interface WindowListener: Quy định các phương thức xử lý khi các sự kiện Window xảy ra.
Interface WindowFocusListener: Quy định các phương thức xử lý khi Window nhận hoặc mất focus Cửa sổ có focus là cửa sổ đang được người dùng sử dụng
Interface WindowStateListener: Quy định phương thức xử lý khi trạng thái Window bị thay đổi.
Abstract class WindowAdapter: Implement các interface WindowListener, WindowStateListener và WindowFocusListener với các phương thức xử lý sự kiện được định nghĩa rỗng
Class WindowEvent: Chứa thông tin cho các sự kiện Window
WindowListener / WindowAdapter void windowActivated(WindowEvent e) Xảy ra khi cửa sổ được kích hoạt (thường
có thanh tiêu đề màu đậm)
void windowDeactivated(WindowEvent
e)
Xảy ra khi cửa sổ không còn ở trạng thái được kích hoạt
void windowClosing(WindowEvent e) Xảy ra khi người dùng muốn đóng cửa
sổ
void windowClosed(WindowEvent e) Xảy ra khi cửa sổ đã được đóng Thường
dùng để "dọn dẹp" bộ nhớ
void windowDeiconified(WindowEvent
e)
Xảy ra khi cửa sổ chuyển từ trạng thái thu nhỏ trở về trạng thái bình thường
void windowIconified(WindowEvent e) Xảy ra khi cửa sổ bị thu nhỏ
WindowFocusListener / WindowAdapter
Trang 8void windowGainedFocus(WindowEvent
void windowLostFocus(WindowEvent e) Xảy ra khi cửa sổ bị mất focus
WindowStateListener / WindowAdapter void windowStateChanged(WindowEvent
WindowEvent
int getNewState()
Trả về trạng thái mới của cửa sổ Gồm:
NORMAL
ICONIFIED
MAXIMIZED_HORIZ
MAXIMIZED_VERT
MAXIMIZED_BOTH Trạng thái được lưu theo từng bit
int getOldState() Trả về trạng thái cũ của cửa sổ
kiện (trong các sự kiện active và focus)
Bảng 3: WindowListener, WindowFocusListener, WindowStateListener và
WindowEvent
Để đăng ký các sự kiện Window cho cửa sổ, ta dùng các phương thức addWindowListener(), addWindowFocusListener(), addWindowStateListaner().
4.3 Sự kiện mouse
Loại sự kiện này xảy ra khi người dùng nhấn chuột, đè / thả chuột, di chuyển chuột, Loại sự kiện này bao gồm:
Interface MouseListener: Quy định các phương thức xử lý khi các sự kiện nhấn chuột, đè / thả chuột, xảy ra
Interface MouseMotionListener: Quy định các phương thức xử lý khi các sự kiện di chuyển chuột, rê chuột xảy ra
Interface MouseWheelListener: Quy định các phương thức xử lý khi sự kiện lăn bánh xe chuột xảy ra
Abstract class MouseAdapter: Implement interface MouseListener với các phương thức xử lý sự kiện được định nghĩa rỗng
Abstract class MouseMotionAdapter: Implement interface MouseMotionListener với các phương thức xử lý sự kiện được định nghĩa rỗng.
Class MouseEvent: chứa thông tin của sự kiện Mouse và Mouse Motion
Class MouseWheelEvent: chứa thông tin của sự kiện lăn bánh xe chuột
Trang 9Phương thức Ý nghĩa
MouseListener / MouseAdapter void mouseClicked(MouseEvent e) Xảy ra khi nhấn chuột (đè và nhả)
void mouseEntered(MouseEvent e) Xảy ra khi chuột đi vào control
void mouseExited(MouseEvent e) Xảy ra khi chuột đi khỏi control
void mousePressed(MouseEvent e) Xảy ra khi đè nút chuột
void mouseReleased(MouseEvent e) Xảy ra khi thả nút chuột
MouseMotionListener / MouseMotionAdapter void mouseDragged(MouseEvent e) Xảy ra khi chuột được "rê" (giữ nút và
di chuyển)
void mouseMoved(MouseEvent e) Xảy ra khi chuột được di chuyển trên
control
MouseWeelListener void mouseWheelMoved(MouseWheelEvent
MouseEvent
int getButton()
Trả về những nút bị thay đổi trạng thái (từ nhấn chuyển sang thả hoặc ngược lại - nếu có) Bao gồm:
NOBUTTON
BUTTON1
BUTTON2
BUTTON3
int getClickCount() Trả về số lần nhấn chuột
Point getPoint() Trả về vị trí của chuột trên control (tính
theo gốc là điểm trên-trái của control)
MouseWeelEvent int getScrollType()
Trả về loại lăn chuột, gồm:
WHEEL_UNIT_SCROLL
WHEEL_BLOCK_SCROLL
int getScrollAmount() Trả về số bước lăn chuột
Trang 10int getWheelRotation() Trả về số vòng lăn (âm nghĩa là lăn về
phía trước – phía xa người dùng)
Bảng 4: MouseListener, MouseMotionListenr, MouseWeelListener, MouseEvent và
MouseWeelEvent
Để đăng ký các sự kiện Mouse với control, ta dùng các phương thức addMouseListener(), addMouseMotionListener() và addMouseWheelListener().
4.4 Sự kiện bàn phím
Loại sự kiện này xảy ra khi người dùng nhấn phím, giữ phím và đè phím
Loại sự kiện này bao gồm:
Interface KeyListener: Quy định các phương thức xử lý khi các sự kiện nhấn phím xảy ra
Abstract class KeyAdapter: Implement interface KeyListener với các phương thức xử lý sự kiện được định nghĩa rỗng
Class KeyEvent: Chứa thông tin về sự kiện bàn phím
KeyListener / KeyAdapter void keyPressed(KeyEvent e) Xảy ra khi người dùng giữ phím
void keyReleased(KeyEvent e) Xảy ra khi người dùng thả phím
void keyTyped(KeyEvent e) Xảy ra khi người dùng nhấn (giữ và thả phím)
KeyEvent int getKeyCode() Trả về mã phím VD: người dùng nhấn '@' sẽ
trả về 64
char getKeyChar() Trả về ký tự ứng với phím VD: người dùng
nhấn tổ hợp shift + 'a' sẽ trả về 'A'
Bảng 5: KeyListener và KeyEvent
Để đăng ký các sự kiện bàn phím với control, ta dùng phương thức addKeyListener()
4.5 Các loại sự kiện khác
Ngoài các loại sự kiện kể trên, trong AWT còn nhiều loại sự kiện khác, ví dụ như:
kích thước,
Trang 11xóa khỏi Container.
Checkbox hoặc Choice.
TextField, TextArea, )
Bảng 6: Các loại sự kiện khác