Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
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
. Как только это исправлено, вот как выглядит пример:
[/g2]
Существует также готовое решение из JIDE , к сожалению, это не является бесплатным. Вот, например, CellSpanTable
:
[/g3]
MultiCellSpanTableExample в порядке, но у него есть небольшая проблема, которая может стать огромной проблемой, если в вашей таблице слишком много столбцов. Как вы можете видеть в примере , заданном тенорсаксом, очевидно, что каждый столбец таблицы имеет дополнительный пиксель в своей ширине. Эти дополнительные пиксели складываются, делая каждый столбец более смещенным, чем последний.
Я мог бы просто исправить это, заменив строку:
cellFrame.width = aColumn.getWidth() + columnMargin;
на:
cellFrame.width = aColumn.getWidth() + columnMargin - 1;
Я знаю, никто не спросил, но я надеюсь, что это кому-то поможет. :)