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

我搜索了很多,并得到了这个Q的一些答案,但其中许多都提到了给出404错误的链接。我想把桌子做成这样:

No. of cells to be merged is not fixed

Java中有什么方法可以做到这一点吗?


答案 1

MultiSpanCellTableExample 演示了如何通过创建自定义来合并单元格。在这个例子中似乎有一个问题,至少在Java 6中是这样。要解决此问题,请在内部替换:TableUIStackOverflowErrorAttributiveCellTableModel.setDataVector()

setColumnIdentifiers(columnNames);

跟:

this.columnIdentifiers = columnNames;

即:

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));
}

问题是调用,从而触发 .修复后,示例如下所示:setColumnIdentifierssetDataVectorStackOverflowError

enter image description here

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

enter image description here


答案 2

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

我可以通过替换该行来简单地解决此问题:

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

跟:

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

我知道没有人问过,但我希望这对某人有所帮助。:)


推荐