如何在DefaultTableModel / JTable中合并单元格?

我搜索了很多并得到了这个Q的答案。但是他们中的许多人都提到了404错误的链接。 我想制作这样的表格:

要合并的单元数不固定

java中有没有这方面的方法?

MultiSpanCellTableExample演示了如何通过创建自定义TableUI来合并单元格。 在这个例子中似乎有一个问题导致StackOverflowError ,至少在Java 6中。为了解决这个问题,在AttributiveCellTableModel.setDataVector()里面替换:

 setColumnIdentifiers(columnNames); 

有:

 this.columnIdentifiers = columnNames; 

IE:

 public void setDataVector(Vector newData, Vector columnNames) { if (newData == null) throw new IllegalArgumentException( "setDataVector() - Null parameter"); dataVector = new Vector(0); // setColumnIdentifiers(columnNames); this.columnIdentifiers = columnNames; dataVector = newData; cellAtt = new DefaultCellAttribute(dataVector.size(), columnIdentifiers.size()); newRowsAdded(new TableModelEvent(this, 0, getRowCount() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT)); } 

问题是setColumnIdentifiers调用setDataVector因此触发StackOverflowError 。 一旦修复,这就是示例的样子:

在此处输入图像描述

JIDE还有一个现成的解决方案,不幸的是它不是免费的。 这是例如CellSpanTable

在此处输入图像描述

MultiCellSpanTableExample很好,但它有一个小问题,如果你的表有太多列,它可能会成为一个大问题。 正如您在tenorsax给出的示例中所看到的,显然每个表列的宽度都有一个额外的像素。 这些额外的像素加起来,使每列比最后一列更多。

我可以通过替换线来解决这个问题:

 cellFrame.width = aColumn.getWidth() + columnMargin; 

有:

 cellFrame.width = aColumn.getWidth() + columnMargin - 1; 

我知道没有人问,但我希望这有助于某人。 🙂