2014-02-18 89 views
12

我搜索了很多,並得到了這個Q的一些答案,但其中很多人提到的鏈接,給404錯誤。 我想打表是這樣的:如何在DefaultTableModel/JTable中合併單元格?

No. of cells to be merged is not fixed

有沒有在Java中的任何方法嗎?

+0

在我的一個項目中,我使用[即SpanTable](https://code.google.com/p/spantable/source/browse/SpanTable/src/main/java/spantable/?r=b5aa2f0d7bc6e0ced427562dcc22396b41963948 )。在另一個我使用組頭[來自SO回答](http://stackoverflow.com/a/11666046/2894369)。試試看。 – alex2410

+0

你應該檢查[this](http://www.java3z.com/cwbwebhome/article/article5/swing_example/JTableExamples4.html)和/或[this](http://www.java2s.com/Code/Java /Swing-Components/MultiSpanCellTableExample.htm)。 – Qiu

+0

@Qui在線程「主」異常java.lang.StackOverflowError –

回答

16

MultiSpanCellTableExample演示如何通過創建自定義TableUI來合併單元格。似乎有在該例子中,導致StackOverflowError,至少在爪哇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

+1

我一直在使用JIDE多年。 API非常豐富,也就是說,如果你負擔得起。我相信他們可能有一個學生版。不確定。做一個谷歌的jidesoft。 –

5

MultiCellSpanTableExample是好的,但它有一個小問題,可以成爲一個巨大的問題,如果你的表中有太多的列。正如您在tenorsax給出的example中看到的,顯然每個表格列的寬度都有一個額外的像素。這些額外的像素加起來,使每列比最後一列更偏移。

我可以簡單地解決這個問題通過更換行:

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

有:

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

我知道沒有人問過,但我希望這可以幫助別人。 :)

+0

謝謝!在發現問題之前找到修復是最好的! – Xerus