JAVA鼠标屏幕绘制拖拽删除矩形
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
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.awt.geom.Rectangle2D.Double;
import java.util.ArrayList;
import javax.swing.JComponent;
public class MouseComponent extends JComponent {
private static final int SIDELENGTH = 10;
private ArrayList<Rectangle2D> squares;
private Rectangle2D current;
public MouseComponent() {
this.squares = new ArrayList<Rectangle2D>();
this.current = null;
this.addMouseListener(new MouseHandle());//监听鼠标点击事件
this.addMouseMotionListener(new MouseMotionHandler());//监听鼠标移动事件
}
//如果鼠标单击屏幕的地方有矩形则不绘制矩形
public Rectangle2D find(Point2D p) {
for (Rectangle2D r : squares) {
if (r.contains(p))
return r;
}
return null;
}
//绘制矩形
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
for (Rectangle2D r : squares) {
g2.draw(r);
}
}
//添加矩形到屏幕
public void add(Point2D p) {
double x = p.getX();
double y = p.getY();
current = new Rectangle2D.Double(x - SIDELENGTH / 2,
y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
squares.add(current);
repaint();
}
//删除矩形
public void remove(Rectangle2D s) {
if (s == null)
return;
if (s == current)
current = null;
squares.remove(s);
repaint();
}
private class MouseHandle extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
current = find(e.getPoint());
//当前位置如果有矩形,且点击大于2次,则删除矩形
if (current != null && e.getClickCount() >= 2)
remove(current);
}
@Override
public void mousePressed(MouseEvent e) {
current = find(e.getPoint());
//当前位置没有矩形则绘制
if (current == null)
add(e.getPoint());
}
}
private class MouseMotionHandler implements MouseMotionListener {
@Override
public void mouseDragged(MouseEvent e) {
//如果当前位置有矩形,进行拖拽。
if (current != null) {
int x = e.getX();
int y = e.getY();
current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2,
SIDELENGTH, SIDELENGTH);
repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
//鼠标在空白屏幕默认箭头
if(find(e.getPoint())==null)setCursor(Cursor.getDefaultCursor());
//碰到矩形区域区域变成十字架
else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
JAVA鼠标屏幕绘制拖拽删除矩形的更多相关文章
- WPF 在image控件用鼠标拖拽出矩形
原文:WPF 在image控件用鼠标拖拽出矩形 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee ...
- 2018-11-19-WPF-在image控件用鼠标拖拽出矩形
title author date CreateTime categories WPF 在image控件用鼠标拖拽出矩形 lindexi 2018-11-19 15:35:13 +0800 2018- ...
- 前端笔记之JavaScript(十一)event&BOM&鼠标/盒子位置&拖拽/滚轮
一.事件对象event 1.1 preventdefault()和returnValue阻止默认事件 通知浏览器不要执行与事件关联的默认动作. preventdefault() 支持Chrome等高 ...
- js仿QQ拖拽删除
原生js实现仿QQ拖拽删除交互,无需任何依赖. 项目演示请看这里, gitHub请移步这里. 由于源码很长,所以贴到最下面了. 效果截图如下: 核心思想呢,就是点击圆点的时候全屏覆盖个canvas,在 ...
- 超强的纯 CSS 鼠标点击拖拽效果
背景 鼠标拖拽元素移动,算是一个稍微有点点复杂的交互. 而在本文,我们就将打破常规,向大家介绍一种超强的仅仅使用纯 CSS 就能够实现的鼠标点击拖拽效果. 在之前的这篇文章中 -- 不可思议的纯 CS ...
- CSharpGL(21)用鼠标拾取、拖拽VBO图元内的点、线或本身
CSharpGL(21)用鼠标拾取.拖拽VBO图元内的点.线或本身 效果图 以最常见的三角形网格(用GL_TRIANGLES方式进行渲染)为例. 在拾取模式为GeometryType.Point时,你 ...
- 【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题
正文 功能 用 UICollectionView 实现两个 cell 之间的位置交互或者拖拽某个位置删除 问题 iOS 11 以上拖拽删除会崩溃,在 iOS 9.10 都没有问题 错误 017-10- ...
- wpf图片查看器,支持鼠标滚动缩放拖拽
最近项目需要,要用到一个图片查看器,类似于windows自带的图片查看器那样,鼠标滚动可以缩放,可以拖拽图片,于是就写了这个简单的图片查看器. 前台代码: <Window x:Class=&qu ...
- 原生js及H5模拟鼠标点击拖拽
一.原生js 1.拖拽的流程动作 鼠标按下 触发onmousedown事件 鼠标移动 触发onmousemove事件 鼠标松开 触发onmouseup事件 2.注意事项: 要防止div移出可视框,要限 ...
随机推荐
- MVC神韵---你想在哪解脱!(十三)
维护模型与数据库结构之间的差别 现在我们已经将应用程序修改完毕,在Movie数据模型中添加了一个Rating属性.现在让我们重新运行应用程序,打开“http://localhost:xx/Movies ...
- SQLite数据库连接方式
http://blog.csdn.net/ZF101201/archive/2010/05/26/5626365.aspx SQLite.NET Type: .NET Framework Cla ...
- 配置 Spring 的声明式事务
<!-- 1. 配置事务管理器 --> <bean id="transactionManager" class="org.springframework ...
- SQL 表锁(转)
其实你可以使用事务处理 比方说在一个字段里面添加一个boolean 的字段当你要处理该字段的时候就 True 哪么别的人都不可以进行操作 如果是False 哪么就可以进行操作--呵可--我是这样的 ...
- CCLabelTTF、CCLabelAtlas和CCLabelBMFont的区别
转自:http://blog.sina.com.cn/s/blog_67a5e47201018tj8.html 在Cocos2d以及Cocos2d-x中,我们经常会用到CCLabelTTF以及CCLa ...
- 云计算平台(检索篇)-Elasticsearch
前段时间为公司基于Elasticsearch(下面简称ES)做了一套检索平台,下面将这段时间积累的一些知识与大家分享,如有不对之处,欢迎大家多多批评与建议.针对Elasticsearch由于东西还是比 ...
- memcahced 更新
memcahc特性: 在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 . Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位 ...
- Fedora下载地址
http://fedoraproject.org/zh_CN/get-fedora-all
- oracle存储过程分页
1.首先在oracle中建包体,用于游标返回当前数据记录集 CREATE OR REPLACE PACKAGE pkg_query AS TYPE cur_query IS REF CURSOR; E ...
- Firefox便携版
安装firefox后默认配置文件在C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox 可以在快捷方式里设置不同的配置文件,但是要注意参数的含义 ...