背景
我有一个名为Table的JTable,并且我有一个不属于DefaultTableModel的列,因此它是不可见的:
final JTable table = new JTable(new DefaultTableModel(new Object[]{"Title", "Artist",
"Album", "Time"}, 0)
我像这样添加相应的行:
int upTo = songList.size();
int idx = 0;
while (idx < upTo) {
SongObject curSong = songList.get(idx);
model.addRow(new Object[]{
curSong.toString(),
curSong.getArtist(),
"-",
curSong.getDuration(),
curSong});
idx++;
}
其中curSong是当前要添加的歌曲对象,SongObject包含有关歌曲的所有数据。 toString()返回歌曲的标题。
问题:
问题是当我尝试像这样访问列时:
SongObject songToPlay = (SongObject) table.getModel().getValueAt(table.getSelectedRow(), 4);
它抛出一个
java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
异常。谁能解释原因并提出解决方案?
提前致谢 :)
最佳答案
链中某处的DefaultTableModel.addRow()
执行私有justifyRows()
方法,该方法将行中未使用的列修整为等于getColumnCount()
的大小。因此,第五列永远不会添加到模型中。结果,当您尝试访问此列时,您得到ArrayIndexOutOfBoundsException
。
如果您需要访问实际的SongObject
,则可以有一个自定义模型,该模型将为给定的行索引返回SongObject
。扩展AbstractTableModel
。有关示例,请参见How to Use Tables教程。
或者,您仍然可以在可见列中使用SongObject
。只需使用将渲染器SongObject
作为字符串的自定义渲染器即可。有关详细信息,请参见Using Custom Renderers。在这种情况下,您可以重用DefaultTableModel
。