本文是在學習中的總結,歡迎轉載但請註明出處:http://blog.csdn.net/pistolove/article/details/41346969
看完這篇文章,你可能會學到到知識如下:
(1)JAVASWING中到滑鼠監聽常用監聽器,包括MouseListener、MouseWheelListener、MouseMotionListener。
(2)不同到滑鼠監聽器到作用各是什麼、滑鼠進行什麼操作時才調用。
(3)MouseListener和MouseAdapter的區別,最好使用MouseAdapter而不是MouseListener,這樣會使得代碼比較整潔。
(4)通過執行個體進一步對這些監聽進行理解。
當使用者點擊滑鼠時,會調用三個監聽器方法:
A: 滑鼠第一次被按下時調用mousePressed,滑鼠被釋放時調用mouseReleased,最後調用mouseClicked。
B: 用MouseEvent類對象作為參數,調用getX()和getY()方法可以獲得滑鼠被按下時滑鼠指標所在到x和y座標。
C: 如果要想區分是單擊、雙擊、三擊就需要使用getClickCount方法。
需要注意的是:
(1) 如果在移動滑鼠的同步選取滑鼠,就會調用mouseMoved而不是mouseDragged;只有滑鼠在一個組件內部停留時才會調用mouseMoved方法,如果滑鼠拖
到組件外面mouseDragged方法也會被調用
(2)mouseEntered和mouseExited方法是在滑鼠進入或者移出組件時被調用。
(3)大部分到應用都對滑鼠點擊感興趣,而對滑鼠移動不感興趣,但是滑鼠移動事件發生到頻率又很高,所以滑鼠移動事件和拖動事件被單獨定義在了
MouseMotionListener這個獨立到介面中。
MouseListener VS MouseAdapter VS MouseWheelListener VS MouseMotionListener VS MouseMotionAdapter
(1)在上面的幾種監聽中,比較常用的是MouseListener和MouseMotionListener,而MouseWheelListener用的比較少。
(2)MouseAdapter擴充了MouseListener,MouseAdapter針對性比較強,當不需要實現MouseListener所有的方法時,可以使用MouseAdapter來來選擇需要使
用哪一種或若干種監聽進行實現,這樣使得代碼看起來更加簡潔,也減少了代碼量。
(3)MouseMotionAdapter也是擴充了MouseMotionListener。
(4)MouseWheelListener是滑鼠滾輪監聽器,一般不使用該監聽。
/**MouseListener介面包含5個滑鼠方法**/
button.addMouseListener(new MouseListener(){@Overridepublic void mouseClicked(MouseEvent e) {/**滑鼠按鍵在組件上單擊(按下並釋放)時調用。**/}@Overridepublic void mouseEntered(MouseEvent e) {/**滑鼠進入到組件上時調用。**/}@Overridepublic void mouseExited(MouseEvent e) {/**滑鼠離開組件時調用。**/}@Overridepublic void mousePressed(MouseEvent e) {/**滑鼠按鍵在組件上按下時調用。**/}@Overridepublic void mouseReleased(MouseEvent e) {/**滑鼠按鍵在組件上釋放時調用。**/}});
/**抽象類別 MouseAdapter(僅重寫所需的方法),可以自由決定需要監聽的方法**/
button.addMouseListener(new MouseAdapter(){/**這裡選擇mouseClicked方法 **/@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);}});
/**用於接收組件上的滑鼠移動事件的接聽程式介面。對於單擊和其他滑鼠事件,請使用 MouseListener。 **/
button.addMouseMotionListener(new MouseMotionListener(){@Overridepublic void mouseDragged(MouseEvent e) {/**滑鼠按鍵在組件上按下並拖動時調用。**/}@Overridepublic void mouseMoved(MouseEvent e) {/**滑鼠游標移動到組件上但無按鍵按下時調用。**/}});
/**用於接收組件上的滑鼠滾輪事件的接聽程式介面。對於單擊和其他滑鼠事件,請使用 MouseListener。對於滑鼠移動和拖動,請使用 MouseMotionListener。**/
button.addMouseWheelListener(new MouseWheelListener(){@Overridepublic void mouseWheelMoved(MouseWheelEvent e) {/**滑鼠滾輪旋轉時調用。**/}});
滑鼠監聽執行個體如下所示:
import java.awt.Cursor;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionListener;import java.awt.geom.Point2D;import java.awt.geom.Rectangle2D;import java.util.ArrayList;import java.util.List;import javax.swing.JComponent;import javax.swing.JFrame;/** * 滑鼠監聽 * 在建立的畫布上建立、擦除、移動方塊 * 1.點擊滑鼠會建立一個方塊 * 2.在已有的方塊雙擊會擦除掉方塊 * 3.用滑鼠拽住方塊可以自由拖動 */public class TestMouseListener {public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {MouseFrame frame = new MouseFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}});}}class MouseFrame extends JFrame {public MouseFrame() {setTitle("滑鼠監聽測試");setSize(300, 200);MouseComponent component = new MouseComponent();add(component);}}class MouseComponent extends JComponent {private static final int SIDELENG = 10;private List<Rectangle2D> square;private Rectangle2D current;public MouseComponent() {square = new ArrayList<Rectangle2D>();current = null;addMouseListener(new MouseHandler());addMouseMotionListener(new MouseMotionHandler());}public void paintComponent(Graphics g) {Graphics2D g2 = (Graphics2D) g;for (Rectangle2D r : square) {g2.draw(r);}}public Rectangle2D find(Point2D p) {for (Rectangle2D r : square) {if (r.contains(p))return r;}return null;}public void add(Point2D p) {double x = p.getX();double y = p.getY();current = new Rectangle2D.Double(x - SIDELENG / 2, y - SIDELENG / 2,SIDELENG, SIDELENG);square.add(current);repaint();}public void remove(Rectangle2D s) {if (s == null)return;if (s == current)current = null;square.remove(s);repaint();}private class MouseHandler extends MouseAdapter {@Overridepublic void mousePressed(MouseEvent e) {current = find(e.getPoint());if (current == null)add(e.getPoint());}@Overridepublic void mouseClicked(MouseEvent e) {current = find(e.getPoint());if (current != null && e.getClickCount() >= 2)remove(current);}}private class MouseMotionHandler implements MouseMotionListener {@Overridepublic void mouseMoved(MouseEvent e) {if (find(e.getPoint()) == null)setCursor(Cursor.getDefaultCursor());elsesetCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));}@Overridepublic void mouseDragged(MouseEvent e) {if (current != null) {int x = e.getX();int y = e.getY();current.setFrame(x - SIDELENG / 2, y - SIDELENG / 2, SIDELENG,SIDELENG);repaint();}}}}