【问题标题】:Moving multiple columns in a JTable在 JTable 中移动多个列
【发布时间】:2013-06-17 16:00:27
【问题描述】:

我在 JTable 中添加和移动多个列时遇到问题。

我在每一列和一个列标题中都有特定日期的数据。移动本身一切都很好,但在我添加并移动下一列后它会重置。

我没有更改项目中任何其他位置的任何列的位置。

这是一个输出示例(仅标题):

| 5 | 6 | 7 | 8 |

添加标题“1”并移动到索引0:

| 1 | 5 | 6 | 7 | 8 |

添加标题“2”并移动到索引 1:

| 5 | 2 | 6 | 7 | 8 | 1 |

添加标题“3”并移动到索引 2:

| 5 | 6 | 3 | 7 | 8 | 1 | 2 |

以及一些跟进的代码(“

 public void recalculateTableDates(String start, String end, Double defaultValue) {     
    String startDate = getTblDetails().getColumnName(1);
    String endDate = getTblDetails().getColumnName(getTblDetails().getColumnCount()-1);

    int sMonth = Integer.parseInt(start.substring(4, 6));
    int sYear = Integer.parseInt(start.substring(0, 4));
    int eMonth = Integer.parseInt(end.substring(4, 6));
    int eYear = Integer.parseInt(end.substring(0, 4));

            // gets distance between 2 values
            // (Used elsewhere in project, working as intended)
    int duration = getDuration(sMonth, sYear, eMonth, eYear);

    Vector<Double> data = new Vector<Double>(duration);

    for(int i = 0; i < data.size(); i++) {
         data.addElement(defaultValue);
    }

    for(int i = 1, mCount = sMonth, yCount = sYear; i < duration+1; i++) {
        String yyyymm = String.valueOf(yCount)+String.format("%02d", mCount++);





                    // Adds to beginning - PROBLEM HERE <<<<<<<<<<<<<<<<<<<<<<<<<<
        if(yyyymm.compareTo(startDate) < 0) {
            getModel().addColumn(yyyymm, data);
            moveColumn(tblDetails.getColumnCount()-1, i);

        } else if(yyyymm.compareTo(endDate) > 0) {
                              // THIS IF STATEMENT WORKING AS INTENDED
                  getModel().addColumn(yyyymm, data);
        }

        if(mCount > 12) {
            mCount = 1;
            yCount++;
        }

    }

    int length = getTblDetails().getColumnCount()-1;
    System.out.println(duration + " " + length);
    if(length > duration) {
        TableColumnModel colModel = getTblDetails().getColumnModel();
        for(int i = length; i > duration; i--) {
            colModel.removeColumn(colModel.getColumn(i));
        }
    }

    this.revalidate();
    this.repaint();
}



    // Moves column in table
 private void moveColumn(int column, int targetIndex) {
      getTblDetails().moveColumn(column, targetIndex);
 }

我意识到代码有点乱。一直在跑来跑去,试图改变这个和那个来修复它。

有谁知道它为什么这样做?我没有丰富的 JTable 经验。

【问题讨论】:

  • 如需更好的帮助,请尽快发帖SSCCE
  • 我的好奇心,为什么在将“2”列添加到 JTable 后,标有“1”的列会移到末尾,“3”列也是如此,我想念那里的逻辑...... . 或者这可能是逻辑

标签: java swing jtable


【解决方案1】:

将列添加到模型时,表的 TableColumns 会从模型中重建,因此您会丢失对表进行的所有自定义。这意味着您丢失了可能已添加的任何自定义渲染器,并且您丢失了列的重新排序。

为了防止这种情况,您可以在最初创建表时执行以下操作:

JTable table = new JTable(...);
table.setAutoCreateColumnsFromModel( false );

因为 TableColumn 不是自动创建的,所以您需要自己执行此操作,代码将类似于:

String header = "Col" + (table.getColumnCount() + 1);
model.addColumn( header );

//  AutoCreate is turned off so create table column here

TableColumn column = new TableColumn( table.getColumnCount() );
column.setHeaderValue( header );
table.addColumn( column );

【讨论】:

  • 我通过直接更改模型中的数据和标识符向量来解决这个问题。看起来更简单。感谢您的帮助
猜你喜欢
  • 2013-01-09
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多