2014-02-18 55 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