gpt4 book ai didi

java - 应用排序器时删除 JTable 行会导致 IndexOutOfBoundsException

转载 作者:行者123 更新时间:2023-12-01 04:50:38 25 4
gpt4 key购买 nike

我有一个包含多行自定义对象的 JTable,其中一列是倒计时的时间组件。当倒计时达到 0 时,该行将自动删除。

我还通过文本框提供了一个过滤选项,用户可以在其中输入内容以按数据过滤行。

如果没有将排序器应用于 JTable,除了过滤之外,一切都可以正常工作(当时间计数到 0 时,行会自行删除)。应用排序器给我一个“java.lang.IndexOutOfBoundsException:无效索引”

我的自定义表格模型如下所示

public Object getValueAt(int rowIndex, int columnIndex) {

CustomObject myObject = customObjects.get(rowIndex);
if (columnIndex == MyFirstColumn) {
return myObject.getData1();
} else if (columnIndex == MySecondColumn) {
return myObject.getData2();
} else if (columnIndex == TimeRemainingColumn) {
if (myObject.getDate() - System.currentTimeMillis() <= 0) {

//If I comment this out I can filter but not remove rows
removeRow(myObject);

return 0;
}
else{
fireTableDataChanged();
return myObject.getDate() - System.currentTimeMillis();
}
}

return DateFormat.getDateInstance().format(new Date(myObject.getDate()));
}


public void removeRow(CustomObject object) {
int row = customObjects.indexOf(object);
customObjects.remove(object);
fireTableRowsDeleted(row, row);
}

这会引发此异常

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:514)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2645)
at javax.swing.JTable.getValueAt(JTable.java:2720)
at javax.swing.JTable.prepareRenderer(JTable.java:5718)
at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
....

转到 DefaultRowSorter.java 它遇到了此异常

public int convertRowIndexToModel(int index) {
if (viewToModel == null) {
if (index < 0 || index >= getModelWrapper().getRowCount()) {
throw new IndexOutOfBoundsException("Invalid index");
}
return index;
}
return viewToModel[index].modelIndex;
}

再上一层楼,为什么删除可以在没有排序器的情况下进行(排序器== null)

public int convertRowIndexToModel(int viewRowIndex) {
RowSorter sorter = getRowSorter();
if (sorter != null) {
return sorter.convertRowIndexToModel(viewRowIndex);
}
return viewRowIndex;
}

调试一下,firstRow 和 endRow 此时均为 0(它们应该是?)但它似乎正在尝试对空列表进行排序/过滤

这是我的表格代码

    myModel = new CustomObjectDataModel();

myTable.setModel(myModel);
mySorter = new TableRowSorter(myModel);

myTable.setRowSorter(mySorter);
myTable.setAutoCreateRowSorter(true);

我四处搜索,发现了一些死链接,表明这是 Java 中的一个错误,但无法确认。

最佳答案

我按照建议使用 Swing Timers 实现了这一点并解决了问题,但这里的问题是修改 EDT 之外的表模型。

关于java - 应用排序器时删除 JTable 行会导致 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15030084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com