背景 我有一个名为 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()
链下游的某处执行私有(private) justifyRows()
方法,该方法将行中未使用的列修剪为等于 getColumnCount 的大小()
。因此第五列永远不会添加到模型中。因此,当您尝试访问此列时,您会收到ArrayIndexOutOfBoundsException
。
如果您需要访问实际的 SongObject
,那么您可以拥有一个自定义模型,该模型将为给定的行索引返回 SongObject
。扩展AbstractTableModel
。请参阅How to Use Tables教程示例。
作为替代方案,您仍然可以在可见列中使用 SongObject
。例如,只需使用将 SongObject
渲染为字符串的自定义渲染器即可。请参阅Using Custom Renderers了解详情。在这种情况下,您可以重用 DefaultTableModel
。
关于java - Swing - 访问时不可见的列抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959922/