2014-02-18 2 views
12

Я много искал и получил ответы на этот вопрос, но многие из них ссылались на ссылки, которые дают ошибку 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

Вы должны проверить [это] (http://www.java3z.com/cwbwebhome/article/article5/swing_example/JTableExamples4.html) и/или [это] (http://www.java2s.com/Code/Java /Swing-Components/MultiSpanCellTableExample.htm). – Qiu

+0

@Qui Исключение в потоке «main» java.lang.StackOverflowError –

ответ

16

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

+1

Я уже много лет использую JIDE. API чрезвычайно богат, то есть, если вы можете себе это позволить. Я считаю, что у них может быть студенческая версия. Не уверен. Сделайте google для jidesoft. –

5

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

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

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

с:

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

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

+0

спасибо! найти исправление, прежде чем даже обнаружить проблему является лучшим! – Xerus

Смежные вопросы