Jak połączyć komórkę w DefaultTableModel / JTable?

Szukałem dużo i dostałem kilka odpowiedzi na to pytanie. ale wiele z nich odnosiło się do linków, które dają błąd 404. Chcę zrobić taki stół:

Nie. komórki do scalenia nie są stałe

Czy jest na to jakaś metoda w Javie?

Author: Jops, 2014-02-18

2 answers

MultiSpanCellTableExample pokazuje, jak scalić komórki, tworząc własne TableUI. Wydaje się, że w tym przykładzie występuje problem, który powoduje StackOverflowError, przynajmniej w Javie 6. Aby to naprawić, wewnątrz AttributiveCellTableModel.setDataVector() zastąp:

setColumnIdentifiers(columnNames);

Z:

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

Problem polega na tym, że setColumnIdentifiers wywołuje setDataVector, a więc uruchamia StackOverflowError. Po ustaleniu, tak wygląda przykład:

Tutaj wpisz opis obrazka

Istnieje również gotowe rozwiązanie z JIDE , niestety nie jest za darmo. Oto na przykład CellSpanTable:

Tutaj wpisz opis obrazka

 17
Author: tenorsax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-24 02:23:56

MultiCellSpanTableExample jest w porządku, ale ma mały problem, który może stać się ogromnym problemem, jeśli tabela ma zbyt wiele kolumn. Jak widać w przykładzie podanym przez tenorsax, najwyraźniej każda kolumna tabeli ma dodatkowy piksel w swojej szerokości. Te dodatkowe piksele sumują się, dzięki czemu każda kolumna jest bardziej przesunięta niż poprzednia.

Mógłbym to po prostu naprawić, zastępując linię:

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

Z:

cellFrame.width = aColumn.getWidth() + columnMargin - 1;
Wiem, że nikt nie pytał, ale mam nadzieję, że to pomoże. ktoś. :)
 6
Author: Pedro Lima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 22:02:58