设想我们有一个表,表中有很多数据(多到竖起滚动条至少要出现)。我们需要一个功能:用鼠标拖动某些项,然后将他们移动另一个位置,例如我们可能想一些名字相似啊,或者是内容相关度更高的数据项在一起。
要支持鼠标拖动,显示要增加drag-drop的支持,不过我不打算详细介绍这个,可以找些其他的资料看看。
大致希望实现以下功能:
1.希望在拖过某项时,有一个背景色的回显,需要增加一个变量以记录当前滑过的项:
private TableItem prevItem;
在dragOver()方法里设置滑过项的背景色,如下:
// 当拖动滑过表项时,设置滑过项的背景色,以标示
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.如果有竖直滚动条在,当拖动最上或最下时,如果滚动条可用,则滚动:
/*
* 以下处理滚动操作
*/
// 如果竖直滚动条未出现,则不需要处理滚动
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.实现移动
/**
*
* @param selection
* @param currentItem
* 鼠标放下时所对的表项
* @param isTop
* 判断是在最顶端放下,还是在最低端放下,此项只针对当currentItem为空时有用
*/
private void moveSelected(IStructuredSelection selection,
Widget currentItem, boolean isTop) {
if (selection.isEmpty()) {
return;
}
List<Field0> 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选中了很多非连续的区域,为了简单,我们只取第一个选中区,方法如下:
private List<Field0> getFirstContinuousBlock(IStructuredSelection selection) {
List<Field0> list = selection.toList();
int firstId = Integer.parseInt(list.get(0).getId());
List<Field0> result = new ArrayList<Field0>();
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中的相对位置。
分享到:
相关推荐
android 拖拽 gridview拖动+自动移位效果 zaker
ctfctf列移位密码自动暴破,在使用栅栏和变异栅栏破解无果的情况下,可以使用这个脚本试一下,需要手动修改脚本中密文、列数和明文首字母,
实现了类似小米launcher中,长按item,移动到其它item时,其它item自动移位的效果
命令MGCD高程点自动移位
MZB高程注记自动移位 输入MZB命令选中要移动的范围即可 只能处理植被类的压盖
Cass插件-植被自动移位
可以处理高程点压盖的问题。不用打散高程点,支持Cass9.1,9.0。
移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器移位寄存器
显示大图片,性能比较好,可设置上限,或者缩小,不卡顿. 支持鼠标滚动缩放 支持鼠标拖动移位
移位寄存器的设计与实现是一项具有挑战性的任务,需要学生掌握计算机组成原理的相关知识,并具备良好的设计和实现能力。本设计可以作为计算机组成原理课程设计的优秀范例,供学生学习和参考。 EDA技术简介 EDA...
4位串入并出移位寄存器 本实验报告的主要内容是设计和实现一个4位串入并出移位寄存器,使用VHDL语言编写电路控制代码,并通过仿真验证实验结果。 首先,移位寄存器是一种基本的数字电路组件,能够实现数据的串行...
jquery鼠标滑动图片移位
移位密码算法实现中,首先需要创建一个 Shift 类,其中包含两个静态函数encryption 和 decryption,用于加密和解密。 加密过程中,首先从文件中读取明文字符,然后将其与移位数字 k 相加,取模 n,得到密文字符。...
excel自动表格,用于桥牌比赛瑞士移位赛制的编排和录入(也适用于棋类比赛的瑞士移位赛制)。实现自动编排对阵表(从高到低,排除重复对阵)、比赛结果的录入最简化、自动生成积分表。
例如,74LS194是一个4位双向移位寄存器,它的逻辑符号和功能表可以在实际应用中进行对照,以加深理解电路中器件的连接方式与工作原理。 移位寄存器的产品很多,不同的产品功能不同。对实际应用中提出的逻辑要求,...
移位寄存器通常由触发器(如D型、T型或JK型触发器)组成,这些触发器连接成链状,每个触发器的输出连接到下一个触发器的输入,形成一个可以存储并按位移动数据的存储链。 在移位寄存器中,数据可以从一端移向另一端...
计算机组成原理实验报告3-数据输出实验 移位门实验.pdf计算机组成原理实验报告3-数据输出实验 移位门实验.pdf计算机组成原理实验报告3-数据输出实验 移位门实验.pdf计算机组成原理实验报告3-数据输出实验 移位门实验...
最新单片机仿真 K1-K4 控制数码管移位显示最新单片机仿真 K1-K4 控制数码管移位显示最新单片机仿真 K1-K4 控制数码管移位显示最新单片机仿真 K1-K4 控制数码管移位显示最新单片机仿真 K1-K4 控制数码管移位显示最新...
关于内存移位,为优化复杂度进行的代码编辑
实现桶形移位器组合逻辑,要实现的功能如下: 输入为32位二进制向量,根据方向和位移值输出循环移位后的32位结果。例如: 输入向量00011000101000000000000000000000,方向左,位移值10,输出向量...