背景
我有一个名为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

07-28 13:56