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

Nik*_*ant 13 java swing jtable tablecellrenderer jtableheader

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

要合并的单元格数不固定

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

ten*_*ica 17

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

setColumnIdentifiers(columnNames);
Run Code Online (Sandbox Code Playgroud)

有:

this.columnIdentifiers = columnNames;
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述


Ped*_*ima 7

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

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

cellFrame.width = aColumn.getWidth() + columnMargin;
Run Code Online (Sandbox Code Playgroud)

有:

cellFrame.width = aColumn.getWidth() + columnMargin - 1;
Run Code Online (Sandbox Code Playgroud)

我知道没有人问,但我希望这有助于某人.:)