java - Swing - 访问时不可见的列抛出异常

标签 java swing jtable indexoutofboundsexception defaulttablemodel

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

相关文章:

java - 单击在 Java 中添加动态文本区域类对象

java - 如何在JTable中显示来自MySQL的数据

java - 将对象数组放入表中 - Java

java - 在 Jtable 中添加 JCombobox 并在 Swing java 中获取行和列

java - 将 jtable 列设置为图像按钮,但动态更改特定行/列上的图像,而不是列中的所有行

java - println(char), 字符转成中文?

java - 在 main() 中访问 jTextArea

java - 拖放 : Trying to understand DropDemo tutorial

java - 检查java awt 2D游戏,jbutton后台更新问题

java - 识别器分配空指针异常