2

有一个 JTable,其中的列按预定义顺序排列。像

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

|标识 | 姓名 |年龄 |

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

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

|名称 | 年龄 | 编号 |

我怎样才能做到这一点?JTable 有方法 moveColumns,但不幸的是这还不够。假设 order 存储在 map: 中。

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 也会移动其他列,所以从文档中:

void moveColumn(int columnIndex,
          int newIndex)

将 columnIndex 处的列及其标题移动到 newIndex。columnIndex 处的旧列现在将在 newIndex 处找到。曾经位于 newIndex 的列向左或向右移动以腾出空间。

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

4

2 回答 2

3

潜在的问题当然是Vector,它用于DefaultTableColumnModel存储列并且它们的顺序没有像样的移动支持。移动是作为删除和添加实现的,这会触发“向左或向右移动”行为。

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

从...开始

|id | name |age |

|name | age | id |

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

|name|id|age

向量。如果您随后将年龄移动到索引 1,它将首先执行删除

|name|id

然后在索引 1 处插入

|name|age|id

通过确保元素始终移动到其原始位置的左侧,您知道移动将如何进行。

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

于 2012-09-25T13:36:44.013 回答
0

编辑

不,我不需要对行进行排序,我需要将列按顺序排列

于 2012-09-25T13:22:56.080 回答