本文是在学习中的总结,欢迎转载但请注明出处: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(){
	@Override
	public void mouseClicked(MouseEvent e) {
		/**鼠标按键在组件上单击(按下并释放)时调用。**/
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		/**鼠标进入到组件上时调用。**/
	}

	@Override
	public void mouseExited(MouseEvent e) {
		/**鼠标离开组件时调用。**/
	}

	@Override
	public void mousePressed(MouseEvent e) {
		/**鼠标按键在组件上按下时调用。**/
	}

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

/**抽象类 MouseAdapter(仅重写所需的方法),可以自由决定需要监听的方法**/

button.addMouseListener(new MouseAdapter(){
	/**这里选择mouseClicked方法 **/
	@Override
	public void mouseClicked(MouseEvent e) {
		super.mouseClicked(e);
	}
});

/**用于接收组件上的鼠标移动事件的侦听器接口。对于单击和其他鼠标事件,请使用 MouseListener。 **/

button.addMouseMotionListener(new MouseMotionListener(){
	@Override
	public void mouseDragged(MouseEvent e) {
		/**鼠标按键在组件上按下并拖动时调用。**/
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		/**鼠标光标移动到组件上但无按键按下时调用。**/
	}
});

/**用于接收组件上的鼠标滚轮事件的侦听器接口。对于单击和其他鼠标事件,请使用 MouseListener。对于鼠标移动和拖动,请使用 MouseMotionListener。**/

button.addMouseWheelListener(new MouseWheelListener(){
	@Override
	public 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() {
			@Override
			public 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 {

		@Override
		public void mousePressed(MouseEvent e) {
			current = find(e.getPoint());
			if (current == null)
				add(e.getPoint());
		}

		@Override
		public void mouseClicked(MouseEvent e) {
			current = find(e.getPoint());
			if (current != null && e.getClickCount() >= 2)
				remove(current);
		}

	}

	private class MouseMotionHandler implements MouseMotionListener {

		@Override
		public void mouseMoved(MouseEvent e) {
			if (find(e.getPoint()) == null)
				setCursor(Cursor.getDefaultCursor());
			else
				setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
		}

		@Override
		public 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();
			}
		}
	}
}

Swing——鼠标(Action)的更多相关文章

  1. selenium 3.0鼠标事件 (java代码)

    注意:ActionChains下相关方法在当前的firefox不工作,建议使用谷歌浏览器. public static void main(String[] args) throws Interrup ...

  2. 章节十四、9-Actions类鼠标悬停、滚动条、拖拽页面上的元素

    一.鼠标悬停 1.在web网站中,有一些页面元素只需要我们将鼠标指针放在上面就会出现被隐藏的下拉框或者其它元素,在自动化的过程中我们使用Actions类对鼠标进行悬停操作. 2.案例演示 packag ...

  3. Selenium常用API的使用java语言之8-模拟鼠标操作

    通过前面例子了解到,可以使用click()来模拟鼠标的单击操作,现在的Web产品中提供了更丰富的鼠标交互方式, 例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能.在WebDriver中,将这些关于鼠标操 ...

  4. 4. selenium中鼠标和键盘操作

    一.鼠标操作 第一步:引入模块函数 from selenium.webdriver.common.action_chains import ActionChains 第二步:元素定位 element ...

  5. 可视化工具solo show-----Prefuse自带例子GraphView讲解

    2014.10.15日以来的一个月,挤破了头.跑断了腿.伤透了心.吃够了全国最大餐饮连锁店——沙县小吃.其中酸甜苦辣,绝不是三言两语能够说得清道的明的.校招的兄弟姐妹们,你们懂得…… 体会最深的一句话 ...

  6. selenium 学习笔记 ---新手学习记录(8) 问题总结(java)

    1.获取执行js代码后的返回值 //获取滚动距离 String jl="return $('#chapterul li').height();"; Long jlhq=(Long) ...

  7. Selenium常用API详解介绍

    转至元数据结尾   由 黄从建创建, 最后修改于一月 21, 2019 转至元数据起始   一.selenium元素定位 1.selenium定位方法 2.定位方法的用法 二.控制浏览器操作 1.控制 ...

  8. 【Selenium-WebDriver问题篇】Selenium实现元素的拖拽(java版)(转)

    https://blog.csdn.net/u010503127/article/details/51381284 Selenium实现元素的拖拽(java版) [前言] 自从淘宝网登陆页出现滑块验证 ...

  9. java selenium 自动化笔记-不是0基础,至少有java基础

    本来今天要学GitHub的,但是在群里问了下小伙伴时被暴击.说我学的东西太多太杂,不是很深入,都是皮毛.哎~自己早深有意识到,因个人能力吧,找的资料都不是很全,加上实际工作没有应用到.所以写一篇sel ...

随机推荐

  1. struts2 Action获取表单传值(属性,类))

    http://blog.csdn.net/sd0902/article/details/8393157 求大神告知两种方法的不同点 都是写个set方法就行了

  2. node的异常处理

    Node是单线程运行环境,一旦抛出的异常没有被捕获,就会引起整个进程的崩溃.所以,Node的异常处理对于保证系统的稳定运行非常重要. node的处理方法: 1.使用throw语句抛出异常 常用的捕获异 ...

  3. ubuntu远程桌面连接命令rdesktop连接windows远程桌面详解

    sudo apt-get install rdesktoprdesktop 124.42.120.174:1433 呵呵,连接成功了. -f 全屏-a 16位色默认端口是3389(linux 22 s ...

  4. swiper display:none 后 在显示 滑动问题

    一般这种问题  必须在本身元素  或者父元素  显示出来  然后调用swiper实例 或者只需加两行 observer:true, // 修改swiper自己或子元素时,自动初始化swiper obs ...

  5. python常用执行方式&变量&input函数

    linux系统中执行py文件方式:  ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...

  6. PHP 5 Timezones

    PHP 支持的时区 下面是 PHP 支持的时区的完整列表,这些对一些 PHP 日期函数很有用. 非洲 美洲 南极洲 北冰洋 亚洲 大西洋 大洋洲 欧洲 印度洋 太平洋 非洲 Africa/Abidja ...

  7. Spring完全基于Java配置和集成Junit单元测试

    要点: 配置继承WebApplicationInitializer的类作为启动类,相当于配置web.xml文件 使用@Configuration注解一个类,在类中的方式使用@Bean注解,则表名该方法 ...

  8. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  9. android launcher 之踩到的坑

    需求: 1. 用android系统launcher 隐藏主菜单 所有应用显示在桌面 即workspace上: 2.隐藏launcher上方默认的google search: 3.切换一套launche ...

  10. Android 5.0 调色 Palette调色功能

    Palette非常好用,也非常好玩. Palette的作用是从图像中提取突出的颜色,这样我们可以根据提取到的色值把它赋给Toolbar,标题,状态栏等,可以使我们的整个界面色调统一,效果非常好看. P ...