上周碰到了一个棘手的需求,就是要把用JTable的列顺序和列宽度保存下来,这次用户调整了列宽度,关闭程序,下次再打开时,这个列的宽还是要保持,因为SWing的特性,都是在程序启动时就确定了列顺序和列宽度,而这个程序又是已经投入生产了的,所以并不好做,但是办法总比问题多,所以我详细阅读了JTable这一块儿的源代码,下面贴出来做个分享。

修改列顺序:

DefaultTableColumnModel columnModel = new DefaultTableColumnModel(){
@Override
public void moveColumn(int columnIndex, int newIndex) {
// 修改列顺序
super.moveColumn(columnIndex, newIndex);
if(columnIndex != newIndex)
//入库操作,在这里修改数据库里的顺序
}
};

重写TableColumnModel的moveColumn方法,可以在改变列顺序时触发,我是在本地嵌入了一个H2Database(一个运行在JDK平台上的微型数据库),所以很方便,如果没有的,也可以写入到文件里面。

至于加载列顺序的方法就不贴了,反正就是把在数据库里的顺序加载出来,替换掉在定义JTable时所定义的那个顺序,然后放入TableModel。

加载列宽度:

table = new JTable(defaultTableModel, columnModel) {
@Override
public void createDefaultColumnsFromModel() {
// 重写该方法,在创建Column时设置数据库里的宽度
TableModel m = getModel();
if (m != null) {
TableColumnModel cm = getColumnModel();
while (cm.getColumnCount() > 0) {
cm.removeColumn(cm.getColumn(0));
} String[] columnNames = new String[m.getColumnCount()];
for(int i = 0; i < m.getColumnCount(); i++){
columnNames[i] = m.getColumnName(i);
}
// 操作h2数据库
                        Map<String, Integer> columnWidthMap = H2Client.getInstantce().buildTableWidth(module.getClass().getName(), columnNames); for (int i = 0; i < m.getColumnCount(); i++) {
TableColumn newColumn = new TableColumn(i,columnWidthMap.get(m.getColumnName(i)));
addColumn(newColumn);
}
}
}
};

重写JTable类的createDefaultColumnsFromModel方法,这个方法是根据Model自动创建Column的,当然,也可以拖动创建,那就不用重写这个方法了。

设置宽度:

Enumeration<TableColumn> tableColumns = table.getColumnModel().getColumns();
while(tableColumns.hasMoreElements()){
TableColumn c = tableColumns.nextElement();
c.addPropertyChangeListener(new PropertyChangeListener() { @Override
public void propertyChange(PropertyChangeEvent evt) {
if("preferredWidth".equals(evt.getPropertyName())){
// 在设置宽度时会触发该事件,把新的宽度设置入数据库
TableColumn tc = (TableColumn)evt.getSource();
String columnName = tc.getHeaderValue().toString();
String tableName = module.getClass().getName();
int width = Integer.valueOf(evt.getNewValue().toString());
//                            数据库操作
H2Client.getInstantce().updateColumnWidth(tableName, columnName, width);
}
}
});
}

给TableColumn加上PropertyChangeListener属性修改事件,宽度修改时,属性为:preferredWidth,把新宽度保存下来。

好了,就到这儿了,欢迎留言。

Java JTable列顺序和列宽度保存在用户本地的更多相关文章

  1. DataTable 删除列 调整列顺序 修改列标题名称

    DataTable dt = new DataTable(); //删除列 dt.Columns.Remove("Sex"); dt.Columns.Remove("Ag ...

  2. 转--DataTable 修改列名 删除列 调整列顺序

    DataTable myDt =dt; //删除列 myDt.Columns.Remove("minArea"); myDt.Columns.Remove("maxAre ...

  3. DataTable 修改列名 删除列 调整列顺序

    DataTable myDt =dt;//删除列myDt.Columns.Remove("minArea");myDt.Columns.Remove("maxArea&q ...

  4. 调整DataTable的列顺序

    地址:https://www.cnblogs.com/gaocong/p/6490159.html 标题:DataTable 修改列名 删除列 调整列顺序 DataTable myDt =dt; // ...

  5. Java使用POI为Excel打水印,调整列宽并设置Excel只读(用户不可编辑)

    本文介绍在Java语言环境下,使用POI为Excel打水印的解决方案,具体的代码编写以及相关的注意事项. 需求描述: 要求通过系统下载的Excel都带上公司的水印,列宽调整为合适的宽度,并且设置为不可 ...

  6. java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

    java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...

  7. Java散列和散列码的实现

    转自:https://blog.csdn.net/al_assad/article/details/52989525 散列和散列码   ※正确的equals方法应该满足的的条件: ①自反性:x.equ ...

  8. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

  9. android手机旋转屏幕时让GridView的列数与列宽度自适应

    无意中打开了一年前做过的一个android应用的代码,看到里面实现的一个小功能点(如题),现写篇文章做个笔记.当时面临的问题是,在旋转屏幕的时候需要让gridview的列数与宽度能自适应屏幕宽度,每个 ...

随机推荐

  1. Python的内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  2. 内联元素于与块元素的转换 相对定位、绝对定位以及fixed定位 Z轴覆盖

    今天上午学习了内联元素于与块元素的转换     个人觉的display:none将元素非常好用,可以配合当鼠标放到这里会出现. 转换成行内元素display: inline;  转换成块元素displ ...

  3. redhat6.5 redis单节点多实例3A集群搭建

    在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...

  4. kafka connect 使用说明

    KAFKA CONNECT 使用说明 一.概述 kafka connect 是一个可扩展的.可靠的在kafka和其他系统之间流传输的数据工具.简而言之就是他可以通过Connector(连接器)简单.快 ...

  5. himm的使用

    1.设置管脚复用 himm 0x200F0100 1 himm 0x200F0104 1 2.设置GPIO_DIR himm 0x201C0400 0xff 3.设置GPIO_DATA himm 0x ...

  6. 面试题-Python高级

    元类 Python 中类方法.类实例方法.静态方法有何区别? 类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为cls, 表示类对象,类对象和实例对象都可调用: ...

  7. lay-verify 无效

    lay-verify 无效 使用lay-verify有两个需要注意的地方: form标签需要添加 class="layui-form" 提交按钮需要添加 lay-submit=&q ...

  8. 未来-区块链-Aliyun:阿里云IoT - 所知不止于感知

    ylbtech-未来-区块链-Aliyun:阿里云IoT - 所知不止于感知 1.返回顶部 1. 基础产品接入 设备接入 设备管理 数据分析 应用开发 网络管理 边缘计算 设备认证 安全运营 AliO ...

  9. laravel Faker-1.faker假数据

    1. 安装 composer require fzaninotto/faker --dev 2. 创建 migrations 参考:laravel文档 3. 定义ModelFactory 说明: 默认 ...

  10. localStorage溢出问题

    项目使用的store.js库 store.js库不能管理localStorage中的过期项到时清除,只能在再次调用get的时候才做处理,如果一直不调用get,过期了也还是占用着空间.溢出后,再储存项目 ...