java中如何合并两个网格_网格中合并(Merge)功能的多种技术方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java中如何合并两个⽹格_⽹格中合并(Merge)功能的多种技
术⽅案
写这篇⽂章,主要是因为我们的“下午茶时间”(项⽬内部的⼀种交流⽅式)激烈地讨论了此类功能的多种实现,我感觉⾮常有意思。
⼤家可以参考⼀下。
我先简单地描述⼀下功能要求,要求设计⼀种数据结构,⽀持⽹格控件(图形化)实现矩形区域的合并效果(Merged)。
⾮矩形区域的合并不在⽀持范围之内。
⼤家可能都在使⽤各种各样的⽹格控件,最出名的可能是FlexGrid。
不过⼤家可以也思考思考,如果是你的话,你会如何设计呢?
有⼀个最基本的⽅法,每⼀个⽹格CELL中预置⼀个变量:MergeID。
我们姑且将这种⽅法称之为"MergeID法"。
此⽅法规则⽐较简单:没有合并的CELL的MergeID都是0,相邻矩形区域的合并CELLs的MergeID相同,且不为0。
将0特殊处理,是为了加快处理速度,毕竟,⼤多数都是没有合并的CELL。
1
1
1
1
1
1
1
1
1
1
如上⾯的⽹格,则左上⾓六个CELL合并,右下⾓四个CELL合并。
这种⽅法的最⼤问题在于,空间占有⽐较浪费,特别是对那些从没有合并的CELL。
另外,对于合并格的描述不清晰,整个⽹格中有多少合并格也不能简单获取,必须经过遍历才知道。
针对上⾯的分析,提出第⼆种⽅案,我们称之为"MergeRange List",这种⽅法的最⼤优势在于将所有合并的矩形区域统⼀管理起来,形成⼀个列表。
⽹格控件在访问Merge属性的时候,再到Range列表中查找,如果找到,则属于合并格,否则为⾮合并格。
这个⽅式在FlexGrid就被使⽤。
显然这种⽅法⽐较成熟。
不过这种⽅式在管理对象的时候,不容易对应。
需要经过映射。
这在需要⼤量访问⽹格CELL对象的时候,会产⽣⼀些效率浪费。
熟悉HTML的⼈,⼤概还知道HTML的表⽰⽅式,在⽹格上通过rowspan和colspan来定义。
在有合并的CELL的左上⾓上,定义其向右和向下的合并范围。
通过这个范围定义,我们也可以确定合并区域。
这种⽅式的定义简单。
不过实现起来,其实有⼀些问题。
我们上⾯讨论⼏种⽅案的时候,忽略了⼀个问题,那就是我们⼀般的⽹格结构,很可能是⼀个CELL对应⼀个对象。
那样的话,我们可以有⼀个新的⽅案,这个⽅案和第⼀个MergeID⽅案联系在⼀起,但是我们不需要额外的MergeID属性,⽽是直接使⽤Object的对象指针。
只需要判断CELL周围的对象是否相等,就可以知道其合并范围。
合并区域的所有CELL的对象相同。
这样,在取数据的时候,不需要进⾏额外映射。
⽽在⽹格控件绘制的时候,才需要合并区域查找。
效率应该可以满⾜。
我们就将这种⽅法叫"Ojbect/MergeID"吧。
总结列举⼀下四种⽅法:
MergeID
MergeRange List
Span
Object/MergeID
这四种⽅法各有利弊。
其实在我们设计过程中,应该抓住⼀个基本点,要的是空间还是效率,还是两者都要。
不同的要求,使⽤不同的设计。