Search code examples
javaswingjtabletablecellrendererjtableheader

How to merge cell in DefaultTableModel/JTable?


I searched a lot and got some answers for this Q. but many of them referred to links which give 404 error. I want to make table like this:

No. of cells to be merged is not fixed

Is there any method in java for this?


Solution

  • MultiSpanCellTableExample demonstrates how to merge cells by creating a custom TableUI. There seem to be a problem in this example that causes StackOverflowError, at least in Java 6. To fix this, inside AttributiveCellTableModel.setDataVector() replace:

    setColumnIdentifiers(columnNames);
    

    with:

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

    The problem is that setColumnIdentifiers calls into setDataVector hence triggering the StackOverflowError. Once fixed, this is how the example looks like:

    enter image description here

    There is also a ready solution from JIDE, unfortunately it is not free. Here is for example CellSpanTable:

    enter image description here