`
liugang594
  • 浏览: 990766 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

让表项支持鼠标拖动移位,并自动滚动滚动条

 
阅读更多

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

 

要支持鼠标拖动,显示要增加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

    在Android开发中,实现“拖拽GridView拖动+自动移位效果”是一项有趣且实用的技术。这个功能在很多应用中都能看到,比如Zaker这样的新闻阅读应用,用户可以通过手势自由调整内容布局,提升用户体验。接下来,我们将...

    GridVIew拖动item,其它item自动移位效果

    这个项目的标题"GridView拖动item,其它item自动移位效果"所描述的,是GridView的一个高级特性,即在拖动一个item(如应用图标)时,周围的其他item会自动调整位置以适应拖动操作。这种效果在很多桌面启动器(如小米...

    MZB高程注记自动移位

    用户只需要输入"MZB"命令,然后选择需要处理的范围,工具会自动检测并分析区域内被植被等覆盖的高程注记,智能地进行调整,使注记远离遮挡物,从而提高地图的可读性。这个过程无需用户手动逐个调整注记位置,大大...

    命令MGCD高程点自动移位.zip

    在IT行业中,尤其是在地理信息系统(GIS)或者AutoCAD等相关领域,命令MGCD高程点自动移位是一个重要的操作。这个操作通常涉及到地形数据处理、工程设计或测绘工作,其中高程点是关键的数据元素,用于表示地表的高度...

    ctf列移位密码自动暴破

    ctfctf列移位密码自动暴破,在使用栅栏和变异栅栏破解无果的情况下,可以使用这个脚本试一下,需要手动修改脚本中密文、列数和明文首字母,

    高程点自动移位

    在IT行业中,尤其是在地理信息系统(GIS)和测绘领域,"高程点自动移位"是一个重要的操作,它涉及到数据处理和精度优化。标题中的“高程点自动移位”指的是在地形测绘过程中解决高程点重叠或者压盖问题的技术。这种...

    Cass插件-植被自动移位

    Cass插件-植被自动移位

    瑞士移位赛制的编排录入工具

    excel自动表格,用于桥牌比赛瑞士移位赛制的编排和录入(也适用于棋类比赛的瑞士移位赛制)。实现自动编排对阵表(从高到低,排除重复对阵)、比赛结果的录入最简化、自动生成积分表。

    移位寄存器的使用说明和反馈节点_labview移位寄存器的使用_

    在实际应用中,移位寄存器和反馈节点经常结合使用,例如在构建递归算法或自动生成序列时。理解两者的区别和协同工作方式对于优化LabVIEW程序的性能至关重要。 综上所述,LabVIEW中的移位寄存器是实现数据处理和存储...

    android ListView和GridView拖拽移位实现代码

    ListView通常用于垂直滚动的单列列表,而GridView则支持多列网格布局。它们都需要一个适配器(Adapter)来提供数据和视图之间的桥梁。适配器可以是ArrayAdapter、CursorAdapter或自定义的Adapter,通过重写getView()...

    移位寄存器原理图+Proteus仿真

    移位寄存器是一种在数字逻辑电路中广泛使用的器件,其主要功能是存储和移动数据。在本项目中,我们将探讨移位寄存器的基本原理、类型、工作方式以及如何在Proteus软件中进行仿真。 移位寄存器是由一系列相互连接的...

    uo_image PB看图.zip_PB缩放图片_pb 显示图片_vasthvb_图片_查看图片

    显示大图片,性能比较好,可设置上限,或者缩小,不卡顿. 支持鼠标滚动缩放 支持鼠标拖动移位

    有趣的内存移位_内存地址移位_cpp移位_算法设计_

    内存移位是编程中一种常见的操作,特别是在C++这样的低级语言中,它涉及到对内存中的数据进行位级别的移动。这种技术在优化代码、处理二进制数据或实现特定算法时非常有用。本文将深入探讨内存移位的概念,以及如何...

    LCD1602滚动显示_液晶屏滚动显示_

    在51单片机系统中,通过编程实现LCD1602的滚动显示是一项基础但重要的技能,这允许在有限的显示空间内展示更多的信息。 LCD1602屏幕的基本特点: 1. 显示尺寸:1602表示它有16个字符宽度和2行显示,每行可以显示16...

    4位串入并出移位寄存器

    4位串入并出移位寄存器 本实验报告的主要内容是设计和实现一个4位串入并出移位寄存器,使用VHDL语言编写电路控制代码,并通过仿真验证实验结果。 首先,移位寄存器是一种基本的数字电路组件,能够实现数据的串行...

    移位寄存器1移位寄存器

    移位寄存器通常由触发器(如D型、T型或JK型触发器)组成,这些触发器连接成链状,每个触发器的输出连接到下一个触发器的输入,形成一个可以存储并按位移动数据的存储链。 在移位寄存器中,数据可以从一端移向另一端...

    VHDL 含并行置位的移位寄存器

    VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种用于电子设计自动化领域的硬件描述语言,它允许工程师以一种类似于编程语言的方式描述数字系统的结构和行为。在本话题中,我们聚焦...

    计算机组成带移位运算实验报告

    本实验旨在通过设计和实现一个带移位运算的模型机,让学生深入理解这些运算的内部机制,并通过实际操作分析其时间复杂度。 1. 实验目的与要求: - 掌握计算机硬件中的移位运算,包括循环左移(RLC)和循环右移(RRC)...

    移位密码原理及算法实现

    移位密码算法实现中,首先需要创建一个 Shift 类,其中包含两个静态函数encryption 和 decryption,用于加密和解密。 加密过程中,首先从文件中读取明文字符,然后将其与移位数字 k 相加,取模 n,得到密文字符。...

Global site tag (gtag.js) - Google Analytics