有一个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的是向左或向右移动以腾出空间。
我可以(动态地)以某种方式将列放在与我的地图中完全相同的顺序吗?
答案 0 :(得分:3)
基本问题当然是Vector
,DefaultTableColumnModel
用来存储列及其顺序没有像样的移动支持。移动是作为删除和添加实现的,它会触发“向左或向右移动”行为。
但是,您可以使用此知识以正确的顺序(从最低索引到最高索引)移动列。
从
开始|id | name |age |
到
|name | age | id |
可以通过首先将name
移动到索引0来实现。这将导致
|name|id|age
矢量。如果您随后将年龄移至索引1,则会先执行删除
|name|id
后跟索引1处的插入
|name|age|id
通过确保元素始终移动到其原始位置的左侧,您就知道了移位的行为。
当然这取决于实现细节,但是编写一个快速单元测试来支持您的假设并使用这些实现细节(或编写您自己的TableColumnModel
;-))
答案 1 :(得分:0)