2014-02-18 6 views
12

Ich suchte viel und erhielt einige Antworten für dieses Q. aber viele von ihnen verwiesen auf Verbindungen, die Fehler 404 geben. Ich möchte Tisch machen wie folgt aus:Wie füge ich Zellen in DefaultTableModel/JTable zusammen?

No. of cells to be merged is not fixed

Gibt es eine Methode in Java für das?

+0

In einem meiner Projekte verwende ich [diese SpanTable] (https://code.google.com/p/spantable/source/browse/SpanTable/src/main/java/spantable/?r=b5aa2f0d7bc6e0ced427562dcc22396b41963948). In einem anderen verwende ich Gruppen-Header aus [dieser SO-Antwort] (http://stackoverflow.com/a/11666046/2894369). Versuch sie. – alex2410

+0

Sie sollten [this] (http://www.java3z.com/cwbwebhome/article/article5/swing_example/JTableExamples4.html) und/oder [this] (http://www.java2s.com/Code/Java /Swing-Components/MultiSpanCellTableExample.htm). – Qiu

+0

@Qui Ausnahme im Thread "Haupt" java.lang.StackOverflowError –

Antwort

16

MultiSpanCellTableExample zeigt, wie Zellen zusammengeführt werden, indem eine benutzerdefinierte TableUI erstellt wird. Es scheint ein Problem in diesem Beispiel zu sein, die StackOverflowError, zumindest in Java 6. führt dies zu beheben, innerhalb AttributiveCellTableModel.setDataVector() ersetzen:

setColumnIdentifiers(columnNames); 

mit:

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

Das Problem ist, dass setColumnIdentifiers Anrufe in setDataVector daher Trigger StackOverflowError. Einmal festgelegt, ist dies, wie das Beispiel wie folgt aussieht:

enter image description here

Es gibt auch eine fertige Lösung von JIDE, leider ist es nicht kostenlos. Hier ist zum Beispiel CellSpanTable:

enter image description here

+1

Ich habe JIDE seit Jahren verwendet. Die API ist sehr reich, das heißt, wenn Sie es sich leisten können. Ich glaube, sie könnten eine Studentenversion haben. Nicht sicher. Mach ein Google für jidesoft. –

5

MultiCellSpanTableExample ist in Ordnung, aber es hat ein kleines Problem, das ein großes Problem, wenn Ihre Tabelle zu viele Spalten werden kann. Wie Sie in der example gegeben durch Tenorsax sehen können, hat offensichtlich jede Tabellenspalte ein zusätzliches Pixel in ihrer Breite. Diese zusätzlichen Pixel addieren sich, wodurch jede Spalte mehr verschoben wird als die letzte.

konnte ich einfach, dass beheben, indem Sie die Zeile ersetzen:

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

mit:

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

Ich weiß niemand gefragt, aber ich hoffe, dass dies jemand hilft. :)

+0

danke! Finden Sie die Lösung, bevor Sie das Problem entdecken, ist das Beste! – Xerus

Verwandte Themen