创建后按指定顺序设置JTable列

时间:2012-09-25 13:17:56

标签: java swing jtable

有一个JTable,其中列以预先排序的顺序排列。像

+ ---------------------- +

| id |姓名|年龄|

我想按顺序移动列(例如name = 0,age = 1,id = 2)。

+ ---------------------- +

| name |年龄| id |

我怎么能做到这一点? JTable有方法moveColumns,但不幸的是这还不够。假设顺序是在地图中进行的:。

Map<String, Integer> columnOrder = getOrder();
for(Map.Entry<String, Integer> e : columnOrder.entrySet()) {
    int columnIndex = jtable.convertColumnIndexToView(jtable.getColumn(e.getKey()).getModelIndex());
    jtable.getColumnModel().moveColumn(columnIndex, e.getValue());
}

这不起作用,因为moveColumn还会移动其他列,因此来自docu:

void moveColumn(int columnIndex,
          int newIndex)
  

将columnIndex的列及其标题移动到newIndex。老人   columnIndex上的列现在可以在newIndex中找到。那列   曾经在newIndex的是向左或向右移动以腾出空间。

我可以(动态地)以某种方式将列放在与我的地图中完全相同的顺序吗?

2 个答案:

答案 0 :(得分:3)

基本问题当然是VectorDefaultTableColumnModel用来存储列及其顺序没有像样的移动支持。移动是作为删除和添加实现的,它会触发“向左或向右移动”行为。

但是,您可以使用此知识以正确的顺序(从最低索引到最高索引)移动列。

开始
|id | name |age |

|name | age | id |

可以通过首先将name移动到索引0来实现。这将导致

|name|id|age

矢量。如果您随后将年龄移至索引1,则会先执行删除

|name|id

后跟索引1处的插入

|name|age|id

通过确保元素始终移动到其原始位置的左侧,您就知道了移位的行为。

当然这取决于实现细节,但是编写一个快速单元测试来支持您的假设并使用这些实现细节(或编写您自己的TableColumnModel ;-))

答案 1 :(得分:0)