gpt4 book ai didi

java - 移动 JTable 中的多列

转载 作者:行者123 更新时间:2023-12-01 23:45:21 25 4
gpt4 key购买 nike

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

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

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

以下是输出示例(仅标题):

| 5 | 6 | 7 | 8 |

添加 header “1”并移至索引 0:

| 1 | 5 | 6 | 7 | 8 |

添加 header “2”并移至索引 1:

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

添加 header “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 没有丰富的经验。

最佳答案

将列添加到模型时,表的 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 );

关于java - 移动 JTable 中的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com