上周碰到了一个棘手的需求,就是要把用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. SQLServer 账户当前被锁定

    嗯,被攻击了一波,烦躁很 ‘帐户当前被锁定,所以用户 ‘sa’ 登录失败.系统管理员无法将该帐户解锁’解决方法 如果短时间内不停连接,就会被SQL SERVER误认为是这是攻击,会将此账号锁定. 要用 ...

  2. Google - Find minimum number of coins that make a given value

    Given a value V, if we want to make change for V cents, and we have infinite supply of each of C = { ...

  3. TensorFlow:检查显卡支持哪个版本的CUDA

    最近想学习TensorFlow深度学习编程,然后就开始查这方面的信息. 第0步是安装环境,配置环境. 首先到TensorFlow的官网查看在Windows上安装的条件和步骤. 可以仅仅安装CPU版本的 ...

  4. WinForm中使用BackgroundWorker异步加载数据并使用进度条

    在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...

  5. windows远程登录报错 CredSSP不支持Oracle

    https://support.microsoft.com/en-us/help/4093492/credssp-updates-for-cve-2018-0886-march-13-2018

  6. servlet_3

    ServletContext 介绍 提供的功能 servlet中获取servletcontext实例 servletcontext接口的方法 package com.fgy; import java. ...

  7. typeof 子类获取父类

    像这样typeof(Typ).BaseType.Name

  8. k8s之Hello World(四)

    实例:Guestbook留言板系统将通过Pod.RC.Service等资源对象搭建完成,成功启动后在网页中显示一条“Hello World”留言.其系统架构是一个基于PHP+Redis的分布式Web应 ...

  9. Flask之 安装与HelloWorld

    安装Flask 首先我们来安装Flask.最简单的办法就是使用pip. pip install flask 然后打开一个Python文件(app.py),输入下面的内容并运行该文件.然后访问local ...

  10. 在mysql配置文件修改sql_mode或sql-mode 怎么办?

    很多在安装程序配置数据库这一步中会出现: 请在mysql配置文件修改sql_mode或sql-mode 这个问题处理很简单: mysql中修改my.cnf,找到sql_mode,修改值为: NO_AU ...