在JTable中设置列的顺序

时间:2010-11-12 14:23:08

标签: java jtable

我有一些带有一些列的JTable。我有一个映射到视图中位置的列标识符的HashMap,例如:

TableHeader1 | TableHeader2 | TableHeader3
    sth.           sth.          sth.

我知道:

TableHeader1 -> position 0
TableHeader2 -> position 1
TableHeader3 -> position 2

现在我想重新排序列。我知道在JTable类中有一个名为moveColumn(A,B)的函数。这会将列从A移动到B,B向左或向右移动。 我的问题是,我想以特定的方式订购整个表格,我该怎么做? 如果我使用moveColumn,我不知道B在哪里被移动,在10个案例中有5个可能是右侧而在其他情况下是错误的一侧。

希望你理解我的问题: - )

4 个答案:

答案 0 :(得分:7)

您可以通过删除所有列并按正确顺序添加列来更改列顺序:

public static void setColumnOrder(int[] indices, TableColumnModel columnModel) {
    TableColumn column[] = new TableColumn[indices.length];

    for (int i = 0; i < column.length; i++) {
        column[i] = columnModel.getColumn(indices[i]);
    }

    while (columnModel.getColumnCount() > 0) {
        columnModel.removeColumn(columnModel.getColumn(0));
    }

    for (int i = 0; i < column.length; i++) {
        columnModel.addColumn(column[i]);
    }
}

答案 1 :(得分:1)

好的,这个怎么样。可能有点遗留。

扩展TableColumn并为您的新班级提供position财产。让它实施Comparable并使用position来比较列。

接下来,扩展DefaultTableColumnModel并将TableColumn存储在有序列表中。

您的JTable现在应该根据position显示列。未经测试但听起来很有趣,所以我可能会稍后再试一试。

答案 2 :(得分:1)

根据@Guillaume的回答,我找到了一种方法,无需删除所有列并再次添加它们。

    SELECT I.IDL_SEQ          
    FROM IDLS I, IDL_CMPS IC
    WHERE I.RECORD_TYPE = 'M' 
    AND IC.IDL_SEQ = I.IDL_SEQ
    AND IC.CMP = '71-43-2'
    AND I.METHOD = 'N0'           
    AND ((I.RUN_INSTRU = '') OR (I.RUN_INSTRU IS NULL))
    AND ((I.PREP_METHOD = 'K9') OR (I.PREP_METHOD IS NULL))
    AND ((I.MATRIX = 'SO') OR (I.MATRIX IS NULL))
    AND ((I.COLUMN_ID = '') OR (I.COLUMN_ID IS NULL)) 
    AND COALESCE(datRunDate, SYSDATE)
    BETWEEN COALESCE(I.EFFECTIVE_DATE, datRunDate, SYSDATE - 1) 
    AND COALESCE(I.STOP_DATE + (59/86400), datRunDate, SYSDATE + 1) 
    AND ((I.SAMPLE_TYPE = 'SAMPLE') OR (SAMPLE_TYPE IS NULL))
    AND ((I.CUST_SAMPLE_ID = 'SB-7') OR (CUST_SAMPLE_ID IS NULL))
    AND ((I.LOCATION = '') OR (LOCATION IS NULL))          
    AND (
         (OTHER_CRITERIA IS NOT NULL AND 404324 IS NOT NULL AND OTHER_CRITERIA = 'P|'||404324) OR
         (OTHER_CRITERIA IS NOT NULL AND 28936 IS NOT NULL AND OTHER_CRITERIA = 'R|'||28936) OR
         (OTHER_CRITERIA IS NOT NULL AND 'ECO' IS NOT NULL AND OTHER_CRITERIA = 'C|'||'ECO') OR
         (OTHER_CRITERIA IS NULL));

这对我来说效果更好,因为使用(SwingX)JXTable时,不会修改不可见列的顺序。

答案 3 :(得分:0)

如果您想按列名重新排序,则可以查看Table Column Reordering建议。