MouseEvent事件
任何组件上都可以发生鼠标事件,如鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个
事件对象,事件源注册监视器的方法是addMouseListener(MouseListener listener);
➊使用MouseIistener接口处理鼠标事件
使用MouseListener接口可以处理以下5种操作触发的鼠标事件:
在事件源上按下鼠标键。
在事件源上释放鼠标键
在事件源上单击鼠标。
鼠标进入事件源。
鼠标退出事件源。
MouseEvent类中有下列几个重要的方法
getX() 获取鼠标指针在事件源坐标系中的x坐标。
getY()获取鼠标指针在事件源坐标系中的y坐标。
●getModifiers()获取鼠标的左键或右键。鼠标的左键和右键分别使用inputEvent类中的常量BUTTONI MASK和BUTTON3 _MASK来表示
●getClickCount() 获取鼠标被单击的次数。
●getSource() 获取发生鼠标事件的事件源。
MouseListener接口中有如下方法:
●mousePressed(MouseEvent) 负责处理在组件上按下鼠标键触发的鼠标事件。即,当你在事件源按下鼠标键时,监视器调用接口中的这个方法对事件做出处理。
●mouseReleased(MouseEvent) 负责处理在组件上释放鼠标键触发的鼠标事件。即,当你在事件源释放鼠标键时,监视器调用按口中的这个方法对事件做出处理。
●mouseEntered(MouseEvenr) 负责处理鼠标进入组件触发的鼠标事件。即,当鼠标指针进入组件时,监视器调用接口中的这个方法对事件做出处理。
●mouseExited(MouseEvent)负责处理鼠标离开组件触发的鼠标事件。即,当鼠标指针离开容器时,监视器调用接口中的这个方法对事件做出处理。
●mouseClicked(MouseEvent)负责处理在组件上单击鼠标键触发的鼠标事件。即,当单击鼠标键时,监视器调用接I口中的这个方法对事件做出处理。
下面的例子10 中,分别监视按钮、文本框和窗口上的鼠标事件,当发生鼠标事件时,获取鼠标指针的坐标值,注意,事件源的坐标系的左上角是原点。
public class Example9_10 {public static void main(String args[]) {WindowMouse win=new WindowMouse();win.setTitle("处理鼠标事件"); win.setBounds(10,10,560,380);}}
import java.awt.*;
import javax.swing.*;
public class WindowMouse extends JFrame {/*** */JButton button;JTextArea area;MousePolice police; WindowMouse() {init();setVisible(true);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); }void init() {setLayout(new FlowLayout());area = new JTextArea(10,28);Font font = new Font("宋体",Font.PLAIN,22);area.setFont(font);police = new MousePolice();police.setView(this);//将当前窗口传递给police组合的窗口 button = new JButton("按钮"); button.addMouseListener(police);addMouseListener(police);add(button);add(new JScrollPane(area));}
}
import java.awt.event.*;
import javax.swing.*;
public class MousePolice implements MouseListener {WindowMouse view;public void setView(WindowMouse view) {this.view = view;}public void mousePressed(MouseEvent e) {if(e.getSource() == view.button&&e.getButton() == MouseEvent.BUTTON1) {view.area.append("在按钮上按下鼠标左键:\n");view.area.append(e.getX()+","+e.getY()+"\n");}else if(e.getSource() == view&&e.getButton() == MouseEvent.BUTTON1) {view.area.append("在窗体中按下鼠标左键:\n");view.area.append(e.getX()+","+e.getY()+"\n");}}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {if(e.getSource() instanceof JButton)view.area.append("\n鼠标进入按纽,位置:"+e.getX()+","+e.getY()+"\n");if(e.getSource() instanceof JFrame)view.area.append("\n鼠标进入窗口,位置:"+e.getX()+","+e.getY()+"\n"); }public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {if(e.getClickCount()>=2)view.area.setText("鼠标连击\n");}
}
❷使用MouseMotionListener接口处理鼠标事件
使用MouseMotionlistener 接口可以处理以下两种操作触发的鼠标事件。
●在事件源上拖动鼠标
●在事件源上移动鼠标
鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent 类自动创建一个事件对象。
事件源注册监视器的方法是addMouseMotionListener(MouseMotionListener listener)。
MouseMotionListener接口中有如下方法,
●mouseDraggedMouseEvent) 负责处理拖动鼠标触发的鼠标事件。即当你拖动鼠标时(不必在事件源上),监视器调用接口中的这个方法对事件做出处理。
●mouseMoved(MouseEvent) 负 责处理移动鼠标触发的鼠标事件。即当你在事件源上移动鼠标时,监视器调用接口中的这个方法对事件做出处理。
可以使用坐标变换来实现组件的拖动。当用鼠标拖动组件时,可以先获取鼠标指针在组/件坐标系中的坐标y,以及组件的左上角在容器坐标系中的坐标a、b:如果在拖动组件时,想让鼠标指针的位置相对于拖动的组件保持静止,那么,组件左上角在容器坐标系中的位置应当是(a+x-x0,a+y-y0)其中x0、y0是最初在组件上按下鼠标时,鼠标指针在组件坐标系中的位置坐标。
下面的例子11使用坐标变换来实现组件的拖动。
public class Example9_11 {public static void main(String args[]) {WindowMove win=new WindowMove();win.setTitle("处理鼠标拖动事件"); win.setBounds(10,10,460,360);}}
import java.awt.*;
import javax.swing.*;
public class WindowMove extends JFrame { LP layeredPane;WindowMove() {layeredPane = new LP();add(layeredPane,BorderLayout.CENTER);setVisible(true);setBounds(12,12,300,300);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class LP extends JLayeredPane implements MouseListener,MouseMotionListener {JButton buttonTom,buttonJerry;int x,y,a,b,x0,y0;LP() {buttonTom=new JButton("用鼠标拖动Tom"); buttonTom.addMouseListener(this);buttonTom.addMouseMotionListener(this);buttonJerry=new JButton("用鼠标拖动Jerry"); buttonJerry.addMouseListener(this);buttonJerry.addMouseMotionListener(this);setLayout(new FlowLayout());add(buttonTom,JLayeredPane.DEFAULT_LAYER);//最下层add(buttonJerry,JLayeredPane.DEFAULT_LAYER); }public void mousePressed(MouseEvent e) {JComponent com=null;com=(JComponent)e.getSource(); setLayer(com,JLayeredPane.DRAG_LAYER);//最上层a=com.getBounds().x;b=com.getBounds().y;x0=e.getX(); //获取鼠标在事件源中的位置坐标y0=e.getY();}public void mouseReleased(MouseEvent e) {JComponent com=null;com=(JComponent)e.getSource(); setLayer(com,JLayeredPane.DEFAULT_LAYER);}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e){}public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e) {Component com=null;if(e.getSource() instanceof Component) {com=(Component)e.getSource(); a=com.getBounds().x; b=com.getBounds().y;x=e.getX(); //获取鼠标在事件源中的位置坐标y=e.getY();a=a+x;b=b+y;com.setLocation(a-x0,b-y0);}}
}