Swing——鼠标(Action)
本文是在学习中的总结,欢迎转载但请注明出处: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)的更多相关文章
- selenium 3.0鼠标事件 (java代码)
注意:ActionChains下相关方法在当前的firefox不工作,建议使用谷歌浏览器. public static void main(String[] args) throws Interrup ...
- 章节十四、9-Actions类鼠标悬停、滚动条、拖拽页面上的元素
一.鼠标悬停 1.在web网站中,有一些页面元素只需要我们将鼠标指针放在上面就会出现被隐藏的下拉框或者其它元素,在自动化的过程中我们使用Actions类对鼠标进行悬停操作. 2.案例演示 packag ...
- Selenium常用API的使用java语言之8-模拟鼠标操作
通过前面例子了解到,可以使用click()来模拟鼠标的单击操作,现在的Web产品中提供了更丰富的鼠标交互方式, 例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能.在WebDriver中,将这些关于鼠标操 ...
- 4. selenium中鼠标和键盘操作
一.鼠标操作 第一步:引入模块函数 from selenium.webdriver.common.action_chains import ActionChains 第二步:元素定位 element ...
- 可视化工具solo show-----Prefuse自带例子GraphView讲解
2014.10.15日以来的一个月,挤破了头.跑断了腿.伤透了心.吃够了全国最大餐饮连锁店——沙县小吃.其中酸甜苦辣,绝不是三言两语能够说得清道的明的.校招的兄弟姐妹们,你们懂得…… 体会最深的一句话 ...
- selenium 学习笔记 ---新手学习记录(8) 问题总结(java)
1.获取执行js代码后的返回值 //获取滚动距离 String jl="return $('#chapterul li').height();"; Long jlhq=(Long) ...
- Selenium常用API详解介绍
转至元数据结尾 由 黄从建创建, 最后修改于一月 21, 2019 转至元数据起始 一.selenium元素定位 1.selenium定位方法 2.定位方法的用法 二.控制浏览器操作 1.控制 ...
- 【Selenium-WebDriver问题篇】Selenium实现元素的拖拽(java版)(转)
https://blog.csdn.net/u010503127/article/details/51381284 Selenium实现元素的拖拽(java版) [前言] 自从淘宝网登陆页出现滑块验证 ...
- java selenium 自动化笔记-不是0基础,至少有java基础
本来今天要学GitHub的,但是在群里问了下小伙伴时被暴击.说我学的东西太多太杂,不是很深入,都是皮毛.哎~自己早深有意识到,因个人能力吧,找的资料都不是很全,加上实际工作没有应用到.所以写一篇sel ...
随机推荐
- 在Linux系统上获取命令帮助信息和划分man文档
使用历史命令history 打完以后前面会有顺序号的比如1 cd2 ls3 pwd如果需要重新执行cd命令则可以执行 !3 命令 命令补全功能 比如你要执行history命令 可以打上histo+键 ...
- 首届.NET Core开源峰会
首届.NET Core开源峰会 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与 形式:每个主题5分钟-15分钟闪电演讲 演讲方式 ...
- Ubuntu14.04安装 HP DeskJet GT 5820 打印机的方法
原创内容发表在 http://www.linuxdiyf.com/linux/25331.html 步骤就是: 这里(https://sourceforge.net/projects/hplip/fi ...
- ERP中的序列管理
1.序列管理 序列管理主要实现系统用到序列生成规则的配置.主要包含序列配置.序列生产两个功能点. 2.术语说明 序列号:指序列中按步长递进的数字. 序列值:指按规则组合了 "拥有者.序列类型 ...
- 【C#复习总结】匿名类型由来
1 属性 这得先从属性开始说,为什么外部代码访问对象内部的数据用属性而不是直接访问呢,这样岂不是更方便一些,但是事实证明直接访问是不安全的.那么,Anders Hejlsberg(安德斯·海尔斯伯格) ...
- LintCode题解之判断是否为平方数之和
简单粗暴 public class Solution { /* * @param : the given number * @return: whether whether there're two ...
- Codeforces Round #305 (Div. 2) A. Mike and Fax 暴力回文串
A. Mike and Fax Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/548/pro ...
- GDAL C#中文路径,中文属性名称乱码问题
昨天写的博客,将C#读取shp中文属性值乱码的问题应该可以解决,博客地址为:http://blog.csdn.net/liminlu0314/article/details/54096119,然后又测 ...
- Android自定义View(LineBreakLayout-自动换行的标签容器)
最近一段时间比较忙,都没有时间更新博客,今天公司的事情忙完得空,继续为我的自定义控件系列博客添砖加瓦.本篇博客讲解的是标签自动换行的布局容器,正好前一阵子有个项目中需要,想了想没什么难度就自己弄了 ...
- 【伯乐在线】100个高质量Java开发者博客
本文由 ImportNew - 夏千林 翻译自 programcreek.欢迎加入翻译小组.转载请见文末要求. ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博 ...