鼠标监听

来源:互联网 发布:js跨域获取iframe内容 编辑:程序博客网 时间:2024/04/25 12:13

 


图说MouseListener,MouseListener接口   参考资料:sun网站上面的两个小程序。  
这是java提供给侦听器(参照jdk中的翻译叫做侦听器)的接受鼠标事件的两个接口的定义。
 
 
 

 

两个public interface MouseListener extends EventListener
{     public void mousePressed(MouseEvent e);// 鼠标按键在组件上单击(按下并释放)时调用。

public void mouseReleased(MouseEvent e); //鼠标按钮在组件上释放时调用。    

public void mouseClicked(MouseEvent e);// 鼠标按键在组件上按下时调用。    

public void mouseEntered(MouseEvent e);// 鼠标进入到组件上时调用。

 public void mouseExited(MouseEvent e);// 鼠标离开组件时调用。

}
 
 
public interface MouseMotionListener extends EventListener
 
{
 
    public void mouseDragged(MouseEvent e);// 鼠标按键在组件上按下并拖动时调用。
 
    public void mouseMoved(MouseEvent e);// 鼠标光标移动到组件上但无按键按下时调用。
 
}
 

 
 
PS:在方法的右边是JDK中关于这个方法的描述,显然,上面的描述并未让我们对这几个方法的操作有很好的理解。
 
例如:public void mouseClicked(MouseEvent e);// 鼠标按键在组件上按下时调用。
 
       public void mousePressed(MouseEvent e);// 鼠标按键在组件上单击(按下并释放)时调用。
 
这两个方法就有点含混,当用户点击组件时,是先发生mouseClicked?还是先发生mousePressed?
 
mouseReleased和mouseClicked又是哪一个先发生呢?
 
当然凭猜测永远也是得不到答案的。那只能用程序证明:
 
 
 
这个程序是用来测试MouseListener接口的
 
(程序来自 http://java.sun.com/docs/books/tutorial/index.html)
 

 


PS:当用户在上面 区域进行鼠标操作时,下面就会有输出用户的鼠标操作的一些信息(按照鼠标
 
事件发生的先后)留心最后三行。就可以清晰的看出mousePressed,mouseReleased ,mouseClicked之间的的关系了。
 
 
 
当用户鼠标刚点击 区域(此时鼠标还未释放,mouseReleased 肯定还没有发生,mouseClicked事件也没有发生),
 
这时用户有两种选择:
 
[选择一:鼠标在当前位置释放]:这种情况下连续产生两个鼠标事件,先产生mouseReleased,后产生mouseClicked
 
[选择二:鼠标拉到另一个地方释放(这种情况很常见,我们在windows下点一文件拖住往其他地方放)]:这时候只发生mouseReleased事件,不发生mouseClicked事件。
 
 
 
 
 
上面输出的信息中也有mouseEntered,mouseExited两个鼠标事件。可以自己运行下程序感受这两个方法。
 
 
 
 
 
下面这个程序用来测试MouseMotionListener
 
(程序来自 http://java.sun.com/docs/books/tutorial/index.html)
 

 


PS:当用户鼠标刚在 区域滑动鼠标时候(这时候没有点住鼠标左键,就叫它滑动)会产生大量的Mousemoved鼠标事件。从上面的输出信息中可以看出来。当用户拉动鼠标的时候(按住鼠标左键,就叫它拉动)会产生大量的mouseDragged鼠标事件(上面没有显示,不过类似)。
 
这里可以看出来,按住鼠标和不按住鼠标是个互斥操作,所以不可能在一次操作中同时出现mouseDragged和Mousemoved两个事件。
 
相对于MouseListener接口,MouseMotionListener接口要好理解的多。
 
 
 
这是中文JDK关于这两个接口的描述:
 
 
 

 

public interface MouseListener
 
extends EventListener
 
用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。(要跟踪鼠标移动和鼠标拖动,请使用 MouseMotionListener。)

 
 
旨在处理鼠标事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 MouseAdapter(仅重写所需的方法)。

然后使用组件的 addMouseListener 方法将从该类所创建的侦听器对象向该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成鼠标事件。鼠标光标进入或离开组件时也会生成鼠标事件。发生鼠标事件时,将调用该侦听器对象中的相应方法,并将 MouseEvent 传递给该方法。

 
 public interface MouseMotionListener extends EventListener
用于接收组件上的鼠标移动事件的侦听器接口。(对于单击和其他鼠标事件,请使用 MouseListener。)

旨在处理鼠标移动事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象 MouseMotionAdapter 类(仅重写有用的方法)。

然后使用组件的 addMouseMotionListener 方法将从该类所创建的侦听器对象向该组件注册。移动或拖动鼠标时会生成鼠标移动事件。(将生成很多此类事件)。发生鼠标移动事件时,将调用该侦听器对象中的相应方法,并将 MouseEvent 传递给该方法。


 
 


 
 
问题:
 


PS:当鼠标快速移动的时候mouseMoved事件无法即时的响应?
 


上图是根据在侦听器mouseMoved方法中绘制蓝色小矩形。让鼠标移动时能产生模拟画笔的效果,不过鼠标快速移动时mouseMoved事件好象产生的不是很均匀。中间好多象素都没有产生mouseMoved事件?或者是产生了mouseMoved事件而无法及时调用绘制矩形的方法?

原创粉丝点击