上周碰到了一个棘手的需求,就是要把用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. cordova文件系统插件的使用方法:cordova-plugin-file

    提供对设备上的文件进行读取和写入的功能支持. 1. 添加插件:cordova plugin add cordova-plugin-file 2. 调用方法:

  2. [工作积累] UE4 TAA ReProjection的精度处理

    先贴一个UE4 TAA的slidehttps://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf ...

  3. Ubuntu 16.10的root默认密码设置

    1.终端输入sudo passwd 2.输入当前用户密码,回车 3.按照终端提示输入新的root密码并确认 4.su root 输入新的密码 5.修改root密码成功

  4. Eclipse 中快捷键

    Ctrl + Shift + T   查看原生类定义

  5. 20175202 《Java程序设计》第五周学习总结

    20175209 2018-2019-2 <Java程序设计>第五周学习总结 教材知识点总结 1.接口声明: 使用关键字interface来定义接口. 定义接口时使用关键字interfac ...

  6. python第三方库之PyGraphics

    有一段代码要import media,打开python自带的IDLE,输入: >>>import media 就会提示没有media这个模块! 原来media模块不是系统的标准模块, ...

  7. netty原理解析

    netty主要采用的是reactor模式(事件)驱动模型,以下主要对reactor进行总结: C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是S ...

  8. [ZZ] NumPy 处理数据

    NumPy-快速处理数据--ndarray对象--数组的创建和存取 https://www.cnblogs.com/moon1992/p/4946114.html NumPy-快速处理数据--ndar ...

  9. Python 模块源

    1.官方:https://pypi.org/ 2.LFD UCI :https://www.lfd.uci.edu/~gohlke/pythonlibs/ 4.清华源:https://pypi.tun ...

  10. [转摘]VMware下Windows系统出现大量可删除ATA Channel的解决办法

    编辑VMX配置文件加上一句话就可以了 devices.hotplug = "false" 原文:http://blog.ihipop.info/2015/05/4830.html