MouseListener 方法接口中的mouseClicked() 方法和mousePressed() 方法有什么区别? 这是一个热门的话题,让我们来深入的找寻答案,Java’s AWT 库提供了两个接口来监听和接收鼠标事件. 一个是 java.awt.event.MouseListener: 
  
  
  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); 
  
  }
    另一个是 java.awt.event.MouseMotionListener: 
  
  
  public interface MouseMotionListener extends EventListener 
  
  { 
  
  public void mouseDragged(MouseEvent e); 
  
  public void mouseMoved(MouseEvent e); 
  
  }
    Swing 提供了 MouseInputListener, 这个接口的同时扩展了MouseMotionListener 和MouseListener 接口.    让我们来看看这些接口中的方法: ・ mousePressed() 当用户按下鼠标按钮时发生.   ・ mouseReleased() 当用户松开鼠标按钮时发生. ・ mouseClicked() 当用户按下并松开鼠标按钮时发生. 用户在选择或双击图标的时候通常会点击鼠标按钮. 用户如果在松开鼠标之前移动鼠标,点击不会导致鼠标相应事件出现.   ・ 因为点击鼠标是按下鼠标和松开鼠标的结合, 在事件分配给 mouseClicked() 方法之前, mousePressed() 和 mouseReleased() 方法已同时被调用.   ・ mouseEntered() 当鼠标离开当前组件并进入你所监听的组件时激活事件. ・ mouseExited() 当鼠标离开你所监听的组件时发生.   ・ mouseDragged() 当用户按下鼠标按钮并在松开之前进行移动时发生.在mouseDragged() 后松开鼠标不会导致mouseClicked().   ・ mouseMoved() 当鼠标在组件上移动而 不时拖动时发生.   要监听鼠标事件就必须调用这些接口之一,或扩展一个鼠标适配器(mouse adapters) 类. AWT 提供了两种监听适配器(listener adapters): java.awt.event.MouseAdapter 和java.awt.event.MouseMotionAdapter. Swing 为MouseInputListener提供了一个叫做javax.swing.event.MouseInputAdapter的适配器. 有了适配器你就不必调用接口中每个方法了. 取而代之, 你只需简单的扩展适配器并重写你要监听的方法就可以了.   如果你还是很迷惑, 再看看API 并写个小测试程序. 有时尝试理解不同事件的最好方法different events. 我写了一个小小的应用程序来表现两种鼠标事件的区别.这里是完整的代码: 
  
  import java.awt.*; 
  
  import java.awt.event.*; 
  
  public class MouseTest extends Frame 
  
  { 
  
  public MouseTest() 
  
  { 
  
  Button b = new Button("JavaWorld JavaQ&A"); 
  
  b.addActionListener( new ActionListener() { 
  
  public void actionPerformed(ActionEvent e) 
  
  { 
  
  System.exit(0); 
  
  } 
  
  } 
  
  ); 
  
  add(b,BorderLayout.NORTH); 
  
  addMouseListener(new MouseTest.MouseHandler()); 
  
  addMouseMotionListener(new MouseTest.MouseMotionHandler()); 
  
  } 
  
  
  // MouseHandler is an inner class that implements the MouseListener. 
  
  // Each method simply prints out a message to the command line. 
  
  private class MouseHandler implements MouseListener 
  
  { 
  
  public void mousePressed(MouseEvent e) 
  
  { 
  
  System.out.println("mouse pressed"); 
  
  } 
  
  public void mouseClicked(MouseEvent e) 
  
  { 
  
  System.out.println("moused clicked"); 
  
  } 
  
  public void mouseReleased(MouseEvent e) 
  
  { 
  
  System.out.println("mouse released"); 
  
  } 
  
  public void mouseEntered(MouseEvent e) 
  
  { 
  
  System.out.println("mouse entered"); 
  
  } 
  
  public void mouseExited(MouseEvent e) 
  
  { 
  
  System.out.println("mouse exited"); 
  
  } 
  
  } 
  
  // MouseMotionHandler is an inner class that implements the MouseMotionListener. 
  
  // Each method simply prints out a message to the command line. 
  
  private class MouseMotionHandler implements MouseMotionListener 
  
  { 
  
  public void mouseMoved(MouseEvent e) 
  
  { 
  
  System.out.println("mouse moved"); 
  
  } 
  
  public void mouseDragged(MouseEvent e) 
  
  { 
  
  System.out.println("mouse dragged"); 
  
  } 
  
  } 
  
  public static void main(String[] args) 
  
  { 
  
  new MouseTest().show(); 
  
  } 
  
  }
    这个应用程序建立了一个窗口和一个按钮.当你移动鼠标并按下按钮时, 应用程序就会在命令行打印出文本消息, 让你看到鼠标响应和事件间的对应关系.   象上边那样写一个小小的测试程序是对陌生的API 进行试验的好方法. 
                               转赛迪

解决方案 »

  1.   

    呵呵,楼主挺有心的。
    但是看你下面注明转赛迪,其实这些文章就是骗稿费的,也是一些不动java的SB编辑们才认为这样的文章有用。因为这些文章中的几乎所有内容都能在sun提供的java API文档中找到,这些文章充其量也就是起到了一个翻译的作用,而且翻译的质量还是参差不齐。
      

  2.   

    我最操心就是鼠标双击事件怎么分离出来?别的事件含义看api文档大致都明白了。
    还有探出快捷菜单的事件怎么样独立出来
      

  3.   

    现在很多学JAVA的人,各方面基础都弱,包括英语阅读能力,而JAVA方面好的中文资料又少,所以这些不算太好的文章对他们也算是不错了。