设想我们有一个表,表中有很多数据(多到竖起滚动条至少要出现)。我们需要一个功能:用鼠标拖动某些项,然后将他们移动另一个位置,例如我们可能想一些名字相似啊,或者是内容相关度更高的数据项在一起。

要支持鼠标拖动,显示要增加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 让表项支持鼠标拖动移位,并自动滚动滚动条相关推荐

  1. java动态语言_java动态类型语言支持(三)

    invokedynamic指令 在前面java动态类型语言支持(一)(二)中我们有提到invokedynamic指令和java.lang.invoke包中的MethodHandle机制,在某种程度上他 ...

  2. java 线性计算器_java版科学计算器,支持表达式计算

    <java版科学计算器,支持表达式计算>由会员分享,可在线阅读,更多相关<java版科学计算器,支持表达式计算(12页珍藏版)>请在人人文库网上搜索. 1.程序设计综合设计题目 ...

  3. java 通配符 日期_java – 使用带有通配符支持的SimpleDateFormat解析日期字符串(例如* yyyy * MM * dd * hh * mm * ss)...

    首先,我想知道是否存在类似于SimpleDateFormat但是支持通配符的现有库?如果没有,最好的办法是什么? 我有这个问题,我需要匹配并从文件名中提取日期,但我似乎无法找到适合这种情况的方法.虽然 ...

  4. java ipv6校验_Java对IPv6的支持详解:支持情况、相关API、演示代码等

    本文由朱益盛.杨晖.傅啸分享,来自IBM Developer社区,原题"使用 Java 开发兼容 IPv6 的网络应用程序",本次收录时有改动. 1.引言 前几天,有个群友跟我讨论 ...

  5. java jxl 筛选_JAVA 用 JXL导出excel怎么给标题设置自动筛选功能,求代码。

    展开全部 一.创建文件 拟生成e5a48de588b63231313335323631343130323136353331333363363435一个名为"test.xls"的Ex ...

  6. java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...

  7. html弹出窗口是浮动,JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解

    本文实例讲述了JS实现弹出浮动窗口.分享给大家供大家参考.具体如下: 这里介绍的JS弹出浮动窗口,支持鼠标拖动和关闭,点击链接文字后弹出层窗口,也称作是弹出式对话框吧. 关于一些参数说明: bodyc ...

  8. java8 注册表_异常 - 错误:注册表项'Software \ JavaSoft \ Java Runtime Environment'\ CurrentVersion'?...

    异常 - 错误:注册表项'Software \ JavaSoft \ Java Runtime Environment'\ CurrentVersion'? 这个问题在这里已有答案: Java错误打开 ...

  9. 连接堡垒机出现java环境_Java 8:长期支持的堡垒

    连接堡垒机出现java环境 斯蒂芬·科尔本 ( Stephen Colebourne )的文章" Java 9可以使用六个星期 "开始," Java 9仅仅六个星期就已经 ...

最新文章

  1. Clip Studio Paint 高级着色学习教程
  2. sort和uniq命令
  3. SAP OData service的执行是如何从Gateway系统转交到backend系统
  4. 选择更安全的方式执行你的puppet更新
  5. java学习(109):StringBuilder,stringbuffer,string区别
  6. 【C语言】字符数组,碎碎念
  7. android studio 横幅,有关 android studio notification 横幅弹出的功能没有反应
  8. xcode 怎么调用midi开发录音_音频应用专业录音声卡:雅马哈UR242声卡教程
  9. 单例模式不能被继承_Spring的单例实现原理
  10. 400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
  11. 如何用发票查验软件快速批量查验发票(返回官网查验截图)
  12. SAP那些事-理论篇-15-SAP顾问的三重境界
  13. android PMU
  14. 【极简教程】Linux Shell 脚本编程
  15. 傲游研发中心在京成立
  16. 还在相信男女之间真的有纯友谊?太傻太天真!
  17. 丢弃 HttpClient 了,这款轻量级框架更强!
  18. CCF CSP认证考试在线评测系统
  19. 使用电源管理模块有效控制GaN功率放大器的电源开关
  20. 使用Open3D绘制三角形

热门文章

  1. 什么是jQuery?
  2. 安卓案例:使用AChartEngine绘制折线图
  3. Python案例:倒置英文句子
  4. 【JSOI2007】【BZOJ1029】【codevs2913】建筑抢修,贪心与堆
  5. 【codevs1163】访问艺术馆,圣战の终焉
  6. dubbo原理_dubbo的底层原理
  7. bzoj4600 [Sdoi2016]硬币游戏 sg函数+结论
  8. 【英语学习】【WOTD】intoxicate 释义/词源/示例
  9. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(6) - 字符串指令/输入输出指令
  10. Android解析SVG