Xử lý các sự kiện trong Java

12 1K 16
Xử lý các sự kiện trong Java

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đ tài 8. X các s ki n trong Javaề ử ự ệ I. Khái ni m và c s x 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 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 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 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 thà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); } 101 public 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); 102 if (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 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 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) {} 103 public 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:ắ ự ệ ầ ộ ố ượ ủ 104 frame.addWindowListener(new Terminator()); Đ k t thúc đ tài này ta li t kê các ph ng th c x 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 focusLost FocusEvent • 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 105 [...]... WindowEvent • getOldState • Window getNewState V Xử các sự kiện chuột Các sự kiện với chuột được xử 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ử 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ử cho tất cả các sự ki ện này nên ta không cài đ ặt giao di... jp.show(getContentPane(),e.getX(),e.getY()); } } ); 106 Tham khảo thêm tại: http:/ /java. sun.com/docs/books/tutorial/uiswing/events/handling.html và http:/ /java. sun.com/docs/books/tutorial/uiswing/events/mouselistener.html Bài tập 1 Viết chương trình xử sự kiện chuột click trên các Botton, n ếu là chu ột trái thì thông báo là “Bạn vừa click chuột trai”, nếu là chuột phải thì thông báo “B ạn v ừa click chu ột phải”... qu ản 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()); } } ); 106 Tham khảo thêm tại: http:/ /java. sun.com/docs/books/tutorial/uiswing/events/handling.html...Interface Methods Parameter/Accessors Nguồn sự kiện mouseMoved MouseWheelListener mousewheelMoved MouseWheelEvent • WindowListener getWheelRotation • getScrollAmount windowClosing windowOpened windowIconified windowDeiconified windowClosed windowActivated . 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. 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

Ngày đăng: 30/09/2013, 09:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan