现在的位置: 首页 > 综合 > 正文

图说MouseListener,MouseListener接口

2013年08月22日 ⁄ 综合 ⁄ 共 2520字 ⁄ 字号 评论关闭
图说MouseListenerMouseListener接口
 
参考资料: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

mouseReleasedmouseClicked又是哪一个先发生呢?

当然凭猜测永远也是得不到答案的。那只能用程序证明:

 

这个程序是用来测试MouseListener接口的

(程序来自 http://java.sun.com/docs/books/tutorial/index.html

PS:当用户在上面 区域进行鼠标操作时,下面就会有输出用户的鼠标操作的一些信息(按照鼠标

事件发生的先后)留心最后三行。就可以清晰的看出mousePressedmouseReleased mouseClicked之间的关系了。

 

当用户鼠标刚点击 区域(此时鼠标还未释放,mouseReleased 肯定还没有发生,mouseClicked事件也没有发生),

这时用户有两种选择:

[选择:鼠标在当前位置释放]:这种情况下连续产生两个鼠标事件,先产生mouseReleased,后产生mouseClicked

[选择二:鼠标拉到另一个地方释放(这种情况很常见,我们在windows下点文件拖住往其他地方放)]:这时候只发生mouseReleased事件,不发生mouseClicked事件。

 

 

上面输出的信息中也有mouseEnteredmouseExited两个鼠标事件。可以自己运行下程序感受这两个方法。

 

 

下面这个程序用来测试MouseMotionListener

(程序来自 http://java.sun.com/docs/books/tutorial/index.html

PS:当用户鼠标刚在 区域滑动鼠标时候(这时候没有点住鼠标左键,就叫它滑动)会产生大量的Mousemoved鼠标事件。从上面的输出信息中可以看出来。当用户拉动鼠标的时候(按住鼠标左键,就叫它拉动)会产生大量的mouseDragged鼠标事件(上面没有显示,不过类似)。

这里可以看出来,按住鼠标和按住鼠标是个互斥操作,所以不可能在一次操作中同时出现mouseDraggedMousemoved两个事件。

相对于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事件而无法及时调用绘制矩形的方法?

 

 

【上篇】
【下篇】

抱歉!评论已关闭.