java 鼠标拖动_java 让表项支持鼠标拖动移位,并自动滚动滚动条
设想我们有一个表,表中有很多数据(多到竖起滚动条至少要出现)。我们需要一个功能:用鼠标拖动某些项,然后将他们移动另一个位置,例如我们可能想一些名字相似啊,或者是内容相关度更高的数据项在一起。
要支持鼠标拖动,显示要增加drag-drop的支持,不过我不打算详细介绍这个,可以找些其他的资料看看。
大致希望实现以下功能:
1.希望在拖过某项时,有一个背景色的回显,需要增加一个变量以记录当前滑过的项:
Java代码
privateTableItem prevItem;
private TableItem prevItem;
在dragOver()方法里设置滑过项的背景色,如下:
Java代码
// 当拖动滑过表项时,设置滑过项的背景色,以标示
if(prevItem !=null) {
prevItem.setBackground(null);
}
Widget item = event.item;
if(item !=null&& (iteminstanceofTableItem)) {
((TableItem) item).setBackground(getTable().getDisplay()
.getSystemColor(SWT.COLOR_GRAY));
}
prevItem = (TableItem) item;
// 当拖动滑过表项时,设置滑过项的背景色,以标示
if (prevItem != null) {
prevItem.setBackground(null);
}
Widget item = event.item;
if (item != null && (item instanceof TableItem)) {
((TableItem) item).setBackground(getTable().getDisplay()
.getSystemColor(SWT.COLOR_GRAY));
}
prevItem = (TableItem) item;
2.如果有竖直滚动条在,当拖动最上或最下时,如果滚动条可用,则滚动:
Java代码
// 如果竖直滚动条未出现,则不需要处理滚动
ScrollBar verticalBar = getTable().getVerticalBar();
intthumb = verticalBar.getThumb();
intmaximum = verticalBar.getMaximum();
if(maximum == thumb) {
return;
}
// 得到当前滚动条的位置
intselection = verticalBar.getSelection();
// 得到表项的高度
intitemHeight = getTable().getItemHeight();
// 得到表的绝对坐标位置
inty_table = getTable().toDisplay(0,0).y;
// 判断是向上滚动还是向下滚动,并处理
booleanisTop = event.y - y_table > itemHeight ?false:true;
if(isTop && selection >0) {
getTable().showItem(getTable().getItem(selection -1));
}elseif(prevItem ==null&& !isTop && selection + thumb
getTable().showItem(getTable().getItem(selection + thumb +1));
}
// 如果竖直滚动条未出现,则不需要处理滚动
ScrollBar verticalBar = getTable().getVerticalBar();
int thumb = verticalBar.getThumb();
int maximum = verticalBar.getMaximum();
if (maximum == thumb) {
return;
}
// 得到当前滚动条的位置
int selection = verticalBar.getSelection();
// 得到表项的高度
int itemHeight = getTable().getItemHeight();
// 得到表的绝对坐标位置
int y_table = getTable().toDisplay(0, 0).y;
// 判断是向上滚动还是向下滚动,并处理
boolean isTop = event.y - y_table > itemHeight ? false : true;
if (isTop && selection > 0) {
getTable().showItem(getTable().getItem(selection - 1));
} else if (prevItem == null && !isTop && selection + thumb < maximum) {
getTable().showItem(getTable().getItem(selection + thumb + 1));
}
3.实现移动
Java代码
privatevoidmoveSelected(IStructuredSelection selection,
Widget currentItem,booleanisTop) {
if(selection.isEmpty()) {
return;
}
List continuousBlock = getFirstContinuousBlock(selection);
booleanhasMoved =false;
if(currentItem !=null) {
hasMoved = moveSelected2Current(continuousBlock,
(TableItem) currentItem);
}elseif(isTop) {
hasMoved = moveSelected2Top(continuousBlock);
}elseif(!isTop) {
hasMoved = moveSelected2Bottom(continuousBlock);
}
if(hasMoved) {
fireDragMovedEvent();
}
}
private void moveSelected(IStructuredSelection selection,
Widget currentItem, boolean isTop) {
if (selection.isEmpty()) {
return;
}
List continuousBlock = getFirstContinuousBlock(selection);
boolean hasMoved = false;
if (currentItem != null) {
hasMoved = moveSelected2Current(continuousBlock,
(TableItem) currentItem);
} else if (isTop) {
hasMoved = moveSelected2Top(continuousBlock);
} else if (!isTop) {
hasMoved = moveSelected2Bottom(continuousBlock);
}
if (hasMoved) {
fireDragMovedEvent();
}
}
这里的Field0是假设为表中存储的模型对象。
这里的hasMoved用于判断是否真的移动了项,如果移动了,发出一个事件通知。通常可以在这里定义一个移动监听列表,当移动时,发出通知,让监听实现者可以在移动后做一些事情。
移动的时候分移到最底、最顶或移到某个中间位置。
这里的getFirstContinuousBlock()方法用于得到一块连续选中区域:因为可能用户用鼠标加ctrl选中了很多非连续的区域,为了简单,我们只取第一个选中区,方法如下:
Java代码
privateList getFirstContinuousBlock(IStructuredSelection selection) {
List list = selection.toList();
intfirstId = Integer.parseInt(list.get(0).getId());
List result =newArrayList();
for(inti =0; i
Field0 field0 = list.get(i);
intid = Integer.parseInt(field0.getId());
if(id == firstId) {
result.add(field0);
}else{
break;
}
firstId++;
}
returnresult;
}
private List getFirstContinuousBlock(IStructuredSelection selection) {
List list = selection.toList();
int firstId = Integer.parseInt(list.get(0).getId());
List result = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Field0 field0 = list.get(i);
int id = Integer.parseInt(field0.getId());
if (id == firstId) {
result.add(field0);
} else {
break;
}
firstId++;
}
return result;
}
这个方法见仁见智。大家可以按自己的想法实现。
5.实现移动
最后就是实现三个对应的方法。也是见人见智。简单一些假如你的input是一个list或者是一个数组,那其实就是修改移动的对象在数组或者是list中的相对位置。
java 鼠标拖动_java 让表项支持鼠标拖动移位,并自动滚动滚动条相关推荐
- java动态语言_java动态类型语言支持(三)
invokedynamic指令 在前面java动态类型语言支持(一)(二)中我们有提到invokedynamic指令和java.lang.invoke包中的MethodHandle机制,在某种程度上他 ...
- java 线性计算器_java版科学计算器,支持表达式计算
<java版科学计算器,支持表达式计算>由会员分享,可在线阅读,更多相关<java版科学计算器,支持表达式计算(12页珍藏版)>请在人人文库网上搜索. 1.程序设计综合设计题目 ...
- java 通配符 日期_java – 使用带有通配符支持的SimpleDateFormat解析日期字符串(例如* yyyy * MM * dd * hh * mm * ss)...
首先,我想知道是否存在类似于SimpleDateFormat但是支持通配符的现有库?如果没有,最好的办法是什么? 我有这个问题,我需要匹配并从文件名中提取日期,但我似乎无法找到适合这种情况的方法.虽然 ...
- java ipv6校验_Java对IPv6的支持详解:支持情况、相关API、演示代码等
本文由朱益盛.杨晖.傅啸分享,来自IBM Developer社区,原题"使用 Java 开发兼容 IPv6 的网络应用程序",本次收录时有改动. 1.引言 前几天,有个群友跟我讨论 ...
- java jxl 筛选_JAVA 用 JXL导出excel怎么给标题设置自动筛选功能,求代码。
展开全部 一.创建文件 拟生成e5a48de588b63231313335323631343130323136353331333363363435一个名为"test.xls"的Ex ...
- java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)
一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...
- html弹出窗口是浮动,JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
本文实例讲述了JS实现弹出浮动窗口.分享给大家供大家参考.具体如下: 这里介绍的JS弹出浮动窗口,支持鼠标拖动和关闭,点击链接文字后弹出层窗口,也称作是弹出式对话框吧. 关于一些参数说明: bodyc ...
- java8 注册表_异常 - 错误:注册表项'Software \ JavaSoft \ Java Runtime Environment'\ CurrentVersion'?...
异常 - 错误:注册表项'Software \ JavaSoft \ Java Runtime Environment'\ CurrentVersion'? 这个问题在这里已有答案: Java错误打开 ...
- 连接堡垒机出现java环境_Java 8:长期支持的堡垒
连接堡垒机出现java环境 斯蒂芬·科尔本 ( Stephen Colebourne )的文章" Java 9可以使用六个星期 "开始," Java 9仅仅六个星期就已经 ...
最新文章
- Clip Studio Paint 高级着色学习教程
- sort和uniq命令
- SAP OData service的执行是如何从Gateway系统转交到backend系统
- 选择更安全的方式执行你的puppet更新
- java学习(109):StringBuilder,stringbuffer,string区别
- 【C语言】字符数组,碎碎念
- android studio 横幅,有关 android studio notification 横幅弹出的功能没有反应
- xcode 怎么调用midi开发录音_音频应用专业录音声卡:雅马哈UR242声卡教程
- 单例模式不能被继承_Spring的单例实现原理
- 400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
- 如何用发票查验软件快速批量查验发票(返回官网查验截图)
- SAP那些事-理论篇-15-SAP顾问的三重境界
- android PMU
- 【极简教程】Linux Shell 脚本编程
- 傲游研发中心在京成立
- 还在相信男女之间真的有纯友谊?太傻太天真!
- 丢弃 HttpClient 了,这款轻量级框架更强!
- CCF CSP认证考试在线评测系统
- 使用电源管理模块有效控制GaN功率放大器的电源开关
- 使用Open3D绘制三角形
热门文章
- 什么是jQuery?
- 安卓案例:使用AChartEngine绘制折线图
- Python案例:倒置英文句子
- 【JSOI2007】【BZOJ1029】【codevs2913】建筑抢修,贪心与堆
- 【codevs1163】访问艺术馆,圣战の终焉
- dubbo原理_dubbo的底层原理
- bzoj4600 [Sdoi2016]硬币游戏 sg函数+结论
- 【英语学习】【WOTD】intoxicate 释义/词源/示例
- Intel 64/x86_64/IA-32/x86处理器 - 通用指令(6) - 字符串指令/输入输出指令
- Android解析SVG