JTable 单元格合并 【转】
单元格合并一、单元格合并。 (1)我们可以使用Jtable的三个方法:getCellRect(),columnAtPoint(),and rowAtPoint()。第一个方法返回一个单元格的边界(Rectangle类),第二、三个方法分别返回屏幕指定位置的列和行。为了实现单元格合并,我们需要重载(overwrite)这三个方法。 (2)另外我们需要找出渲染Jtable的ComponentUI对象,并且修改它以达到我们的目的。 (3)创建新的类记录单元格合并情况的数据模型,它要包涵一个方法来取得单元格的所跨越的列数。另外,为了使用Jtable画(paint)起来更容易些,我们需要一个方法来确定指定单元格是否被其它单元格所覆盖,被哪个单元格覆盖。我们将这两种方法都集成在接口Cmap里:
现在我们开始重载上面提及过的三个方法。由于我们目前只关注于跨列单元格的合并,方法rowAtPoint()就不用重载了。然而,方法columnAtPoint()就必须重载了,我们会使用Jtable自身的方法来取得指定单元格的列值,并且计算出覆盖该单元格的可视单元格列值(如果该单元格本来就是可视的,则返回自身列值)。在单元格合并后,在合并区域内只有一个跨越多列的可视单元格,其它被覆盖的单元格则不会再被渲染。当使用getCellRect()方法取得被覆盖的单元格的大小时,都返回覆盖该单元格的可视单元格的大小。
现在剩下的就只有创建一个表格的渲染对象了。不同的用户接口管理器(user interface managers)使用不同的类来画表格。我们会继承子类 javax.swing.plaf.basic.BasicTableUI,并且重载其方法 paintComponent。
http://www.swingwiki.org/howto:column_spanning 今天下载了关于java swing的一个开源项目包tame,不过由于完成年代久远(98年),很多类在新的jdk1.4或jdk1.5上已经会报错。例如AttributiveCellTableModel类的setDataVector方法便需要改为:
public void setDataVector(Vector newData, Vector columnNames)
{ super.setDataVector(newData, columnNames); cellAtt = new DefaultCellAttribute(dataVector.size(),columnIdentifiers.size()); } 有心重整tame,先记一笔。 ①java swing基于MVC架构,或者说是Model-driven结构。以jtable为例,它的特有GUI-State Model是TableColumnModel(JTable是面向列的,它基于每一列进行绘制和编辑。分别是列绘制器TableCellRenderer和列编辑器TableCellEditor);它的共有GUI-State Model是Selection Model(和jlist、jtree等共用)。除了GUI-State Model,还有决定显示在控件中的内容的Application-data model,jtable的Application-data model是TableModel。实现方式是先定义接口TableModel,再定义抽象类AbstractTableModel实现这个接口,然后由DefaultTableModel实现抽象类。不过一般来说用户需要自己扩展AbstractTableModel实现它的几个方法来获取和设定值。
②以jtable为例,它并未提供实现单元格合并的方法。所以我们需要重载它的三个方法(getCellRect:获取单元格的边界,columnAtPoint和rowAtPoint:分别返回屏幕指定位置的列和行)。
③现在我们需要自己绘制jtable,所以要用到Graphics类。另大部分的swing components 并不是直接由paint()方法来渲染(render),而是使用ComponentUI对象来完成渲染的。所以我们需要找出渲染Jtable的ComponentUI对象(BasicTableUI),并且修改它(重载paint()方法)以达到我们的目的。
④现在开始具体实现,tame先定义了4个接口(CellAttribute、ColoredCell、CellFont、CellSpan),用DefaultCellAttribute类实现了这四个接口,包含相关表格的基本属性(颜色、字体、合并单元格的属性等),这个类将每个cell定义为一个三维数组int[][][] span,并且都初始化为1。继承自DefaultTableModel的AttributiveCellTableModel负责初始化table,至此并无特异之处。当需要合并单元格时。监听按钮将调用DefaultCellAttribute的combine方法把被覆盖的单元格的三维数组int[][][] span设置为小于1,这样在绘制的时候就可以判断哪单元格可见,哪些单元格不可见了。接着通过重载jtable的三个方法得到cell的边界以及行和列的位置,重绘表格的时候通过每个cell返回的结果(边界、位置、是否可见)等循环绘制。
发表于 2006-04-05 09:04 沉思的狗
2010-05-01 11:11
JTABLE单元格合并(转)最近,我为了做一个管理系统,需要用到合并JTable的单元格。查找了很多资料,终于简单的实现了。现在把代码共享出来,希望对大家有用。 本程序主要实现行的合并,列的合并大家可以根据下面的代码修改。 CMap.java : package com; public interface CMap { /** CTUI.java : package com; import javax.swing.table.*; public class CTUI extends BasicTableUI { private void paintCell(int row, int column, Graphics g, Rectangle area) { Color c = g.getColor(); area.setBounds(area.x + horizontalMargin / 2, area.y + verticalMargin/ 2,
area.width - horizontalMargin, area.height- verticalMargin);
if (table.isEditing() && table.getEditingRow() == row&& table.getEditingColumn() == column) { CTable.java : package com;
import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class CTable extends JTable { public CTable(CMap cmp, TableModel tbl) { public Rectangle getCellRect(int row, int column, boolean includeSpacing) { CMap1.java : /****************************************************************************************** CMap1对CMap地实现 span( ) 表示合并的单元格的列,返回的是合并的格数。 visibleCell() 表示要渲染的格。返回的渲染的开始格的行。 本程序的table是16行10列,合并的单元格是第一列和最后一列(最后一列是第10列)每两个行。 *******************************************************************************************/ package com; import javax.swing.*; class CMap1 implements CMap { public int visibleCell(int row, int column) {
if( ( ( row >= 0 ) && ( row < 2 ) ) && ( column == 0 || column == 9 ) ) return 0; if( ( ( row >= 2 ) && ( row < 4 ) ) && ( column == 0 || column == 9 ) ) return 2; if( ( ( row >= 4 ) && ( row < 6 ) ) && ( column == 0 || column == 9 ) ) return 4; if( ( ( row >= 6 ) && ( row < 8 ) ) && ( column == 0 || column == 9 ) ) return 6; if( ( ( row >= 8 ) && ( row < 10 ) ) && ( column == 0 || column == 9 ) ) return 8; if( ( ( row >= 10 ) && ( row < 12 ) ) && ( column == 0 || column == 9 ) ) return 10; if( ( ( row >= 12 ) && ( row < 14 ) ) && ( column == 0 || column == 9 ) ) return 12; if( ( ( row >= 14 ) && ( row < 16 ) ) && ( column == 0 || column == 9 ) ) return 14; System.out.println( ">>>row = " + row + "column = " + column ); return row; } } 下面的程序进行测试。 package com; import javax.swing.*; public class CTest { CMap m = new CMap1(); |
JTable 单元格合并 【转】的更多相关文章
- 在JTable单元格上 加入组件,并赋予可编辑能力 [转]
表格(单元格放置组件) 对于JTable单元格的渲染主要是通过两个接口来实现的,一个是TableCellRenderer另一个是TableCellEditor,JTable默认是用的是DefaultC ...
- ExtJS 4.2 Grid组件的单元格合并
ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid ...
- NPOI 教程 - 2.1单元格合并
来源:http://liyingchun343333.blog.163.com/blog/static/3579731620091018212990/ 合并单元格在制作表格时很有用,比如说表格的标题就 ...
- asp.net使用控件datagrid实现表头单元格合并
合并的要点: 1.datagid的单元格合并原理是table中tr,td的布局实现; 2.合并的时机实在其datagridcreate事件中实现; 3.认识一个对象TableCellCollectio ...
- DataGridView单元格合并
本文章转载:http://www.cnblogs.com/xiaofengfeng/p/3382094.html 图: 代码就是如此简单 文件下载:DataGridView单元格合并源码 也可以参考: ...
- devexpress实现单元格合并以及依据条件合并单元格
1.devexpress实现单元格合并非常的简单,只要设置属性[AllowCellMerge=True]就可以了,实现效果如下图: 2.但是在具体要求中并非需要所有的相同单元格都合并,可能需要其他的条 ...
- SNF快速开发平台MVC-表格单元格合并组件
1. 表格单元格合并组件 1.1. 效果展示 1.1.1. 页面展现表格合并单元格 图 4.1 1.1.2. 导出excel合并单元格 图 4.2 1.2. 调用说 ...
- 关于table动态添加数据 单元格合并 数组合并
var newArr = [ {"BranchID":1,"BranchName":"城二","BranchFullName&qu ...
- excel技巧--单元格合并与拆分
如果要将上图的地区列做成下图的合并单一列: 有如下做法: (以下图表格为例) 1.选择要排序的表格,点击“开始”-->排序和筛选-->自定义排序.在对话框选择“业务项目”进行排序: 2.选 ...
随机推荐
- POJ 1274 The Perfect Stall(二分图最大匹配)
题意: N头牛M个牛棚,每只牛都有它自己指定的若干个它愿意呆的牛棚. 每个牛棚最多呆一头牛. 问最多可以满足多少头牛的愿望. 思路: 裸二分图最大匹配. 代码: int n,m; vector< ...
- oracle修改CHARACTERSET
[oracle@vm10-84-32-2 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Jun 11 1 ...
- 小白都能看懂的Spring源码揭秘之IOC容器源码分析
目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...
- 修改记事本PE结构弹计算器Shellcode
目录 修改记事本PE结构弹计算器Shellcode 0x00 前言 0x01 添加新节 修改节数量 节表位置 添加新节表信息 0x02 添加弹计算器Shellcode 修改代码 0x03 修改入口点 ...
- 手把手从0到1:搭建Kubernetes集群
搭建 k8s 集群网上很多教程,如果是手工部署或者实验环境可以直接使用 MiniKube 或者 Kind,来在本地启动简单的 Kubernetes 集群进行后面的学习即可.如果是使用 MiniKube ...
- 前端调试工具(DevTools)
前端调试工具(DevTools) 开启:F12 布局 切换PC和移动端 页面元素的快速测试技巧 保持元素的hover等状态:选中当前行点击右键 元素状态改变的监控技巧 触发断点后元素状态不会再改变,可 ...
- git删除未被追踪的文件
# 先看看会删掉哪些文件,防止重要文件被误删 git clean -n # 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git cle ...
- uni-城市列表滑动组件,点击字母跳转到指定位置
本插件由博主自主开发,比uni插件市场的城市列表滑动组件性能好,且不会出现闪屏的情况. 通过计算城市列表的高度实现滚动到指定位置,使用了uni滚动到指定位置的api city-chooce为页面入口页 ...
- CF285D.D. Permutation Sum
CF285D. Permutation Sum 题目 大意 寻找a,b两个排列从0到n-1,有c[i]=(a[i]+b[i])%n+1,使得c[i]也为全排列的排列方式 思路 a中元素和b中元素的对应 ...
- Effective C++ 总结笔记(一)
一.让自己习惯C++ 01.视C++为一个语言联邦 c++是多重范型编程 语言,视c++包括4种次语言: 1:C 2:Object-Oreinted C++: 3:Template C++: 4:ST ...