我遇到了JTable(JDK 1.5_22)的奇怪行为:
在表中选择更改并在某些未知的特定情况下,JTable将使用'null'为值参数调用单元格渲染器。
这最终会在自定义渲染器代码上导致一个不错的“空指针异常”,而这个代码还没有为这种粗鲁的调用做好准备。
这是有罪的方法(JTable.java,第5319行):
public Accessible getAccessibleChild(int i) {
if (i < 0 || i >= getAccessibleChildrenCount()) {
return null;
} else {
// children increase across, and then down, for tables
// (arbitrary decision)
int column = getAccessibleColumnAtIndex(i);
int row = getAccessibleRowAtIndex(i);
TableColumn aColumn = getColumnModel().getColumn(column);
TableCellRenderer renderer = aColumn.getCellRenderer();
if (renderer == null) {
Class<?> columnClass = getColumnClass(column);
renderer = getDefaultRenderer(columnClass);
}
Component component = renderer.getTableCellRendererComponent(
JTable.this, null, false, false,
row, column);
return new AccessibleJTableCell(JTable.this, row, column,
getAccessibleIndexAt(row, column));
}
}
以下是对错误陈述的关注:
Component component = renderer.getTableCellRendererComponent(
JTable.this, null, false, false,
row, column);
问谷歌蒙特“JTable getAccessibleChild 5334”很有意思:我并不是唯一一个遇到这个“功能”的人。但是没有答案。
最精心设计的问题位于on official sun forum。
有没有人对此有所了解?
答案 0 :(得分:5)
这不是同步或EDT问题。 JTable
中的代码显式调用getTableCellRendererComponent
为空值。
从不使用返回的值,因此,从表面上看,它看起来像旧的调试代码。但是我怀疑它是否存在中断代码,希望在访问单元格之前调用getTableCellRendererComponent
。
之前已经调用了Sun这个问题,他们的答案是API不保证value
是非空的,所以getTableCellRendererComponent
在使用null调用时必须正常失败。
答案 1 :(得分:0)
任何时候我都会看到像这样的莫名其妙的问题,我想知道不正确的同步。例如,
1)未能在event dispatch thread上构建组件。
2)在其他一些线程上改变组件的模型。
在存在复杂初始化,具有意外延迟的模型或不同硬件的情况下,违规更频繁地出现。可能还有一个错误,但这两点值得检查。