Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
650,77 KB
Nội dung
Đ 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.ượ ạ TrongJava 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 trongcá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 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 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) {} 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 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 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ử lýcácsự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ácsự 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ử lý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 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()); } } ); 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