Как слить ячейку в DefaultTableModel/JTable?

Я много искал и получил ответы на этот вопрос, но многие из них ссылались на ссылки, которые дают ошибку 404. Я хочу сделать таблицу следующим образом:

No. of cells to be merged is not fixed

Есть ли какой-либо метод в java для этого?

Ответ 1

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. После исправления это выглядит так:

enter image description here

Существует также готовое решение от JIDE, к сожалению, оно не является бесплатным. Вот, например, CellSpanTable:

enter image description here

Ответ 2

MultiCellSpanTableExample в порядке, но у него есть небольшая проблема, которая может стать огромной проблемой, если в вашей таблице слишком много столбцов. Как вы можете видеть в пример, заданный тенорсаксом, очевидно, что каждый столбец таблицы имеет дополнительный пиксель в своей ширине. Эти дополнительные пиксели складываются, делая каждый столбец более смещенным, чем последний.

Я мог бы просто исправить это, заменив строку:

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

с:

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

Я знаю, никто не спросил, но я надеюсь, что это поможет кому-то.:)