Java 原因是什么
这是我的第一个问题。首先,我是Java新手,仍然在努力理解事件。我有一个扩展AbstractTableModel的定制模型JTable,一个实现TableModelListener的定制TableModelHandler和一个定制TableCellRenderer,以显示一些定制工具提示(来自不同列的数据组合)。用户只能进行单行选择,我选中了选项autocreaterowsorter。删除行时,我使用以下方法:Java 原因是什么,java,Java,这是我的第一个问题。首先,我是Java新手,仍然在努力理解事件。我有一个扩展AbstractTableModel的定制模型JTable,一个实现TableModelListener的定制TableModelHandler和一个定制TableCellRenderer,以显示一些定制工具提示(来自不同列的数据组合)。用户只能进行单行选择,我选中了选项autocreaterowsorter。删除行时,我使用以下方法: public void removeRow(int modelIndex) {
public void removeRow(int modelIndex) {
fireTableRowsDeleted(modelIndex, modelIndex);
rowData.remove(modelIndex);
}
我第一次触发数据更改事件的原因是,我想用一个包含我要删除的行中的数据的文本更新JLabel(可能有一种更优雅的方法)。我总是传递模型索引行,我尝试清除视图中的选择,但没有帮助。我似乎无法100%地再现错误,但似乎大多数情况下都是在我编辑一行之后发生的,有一个列排序处于活动状态,然后删除一行(这实际上是发生错误之后的操作)
所以,问题是:我如何判断我的问题的原因是什么?整个代码有点太大,无法在这里发布,但是如果有人想看一下,我可以提供它
错误(出现时间很长):
你越来越
IndexOutOfBoundsException
从堆栈跟踪。这意味着您正在引用大于数组长度的数组索引
这可能是在删除行后发生的。您需要确保删除行时,注意删除行之后所有行的索引都将更改
换句话说,如果你有
0—第1行1--第2行
2--第3行
3--第4行 如果删除索引1处的行,则表如下所示 0—第1行
1--第3行您将获得 IndexOutOfBoundsException 从堆栈跟踪。这意味着您正在引用大于数组长度的数组索引 这可能是在删除行后发生的。您需要确保删除行时,注意删除行之后所有行的索引都将更改 换句话说,如果你有 0—第1行
1--第2行
2--第3行
3--第4行 如果删除索引1处的行,则表如下所示 0—第1行
1--row3对于初学者,请查看ContactsGUI.java行1975。这就是抛出异常的地方。查看此处引用的ArrayList。然后,您必须查看该列表的大小是在哪里确定的,以及如何决定从该列表访问哪个元素
如果您使用IDE,请在该行上设置断点并调试应用程序-这可能会有很大帮助。对于初学者,请查看ContactsGUI.java行1975。这就是抛出异常的地方。查看此处引用的ArrayList。然后,您必须查看该列表的大小是在哪里确定的,以及如何决定从该列表访问哪个元素 如果您使用IDE,请在该行上设置断点并调试应用程序-这可能会有很大帮助 我第一次触发数据更改事件的原因是,我想用一个包含我要删除的行中的数据的文本更新JLabel(可能有一种更优雅的方法) 此功能不应是TableModel的一部分。调用delete逻辑的按钮应该在调用remove row方法之前保存所需的信息。然后,removeRow()代码应该在触发TableRows deleted事件之前从rowData中删除该行 但似乎大多数情况下,在我编辑一行之后,会有一个列排序处于活动状态,然后删除一行 您需要将行视图转换为行模型。我认为代码应该是这样的:
int modelRow = tableConvertRowIndexToModel( selectedRow );
rowData.remove(modelRow);
fireTableRowsDeleted(modelRow, modelRow);
我第一次触发数据更改事件的原因是,我想用一个包含我要删除的行中的数据的文本更新JLabel(可能有一种更优雅的方法)
此功能不应是TableModel的一部分。调用delete逻辑的按钮应该在调用remove row方法之前保存所需的信息。然后,removeRow()代码应该在触发TableRows deleted事件之前从rowData中删除该行
但似乎大多数情况下,在我编辑一行之后,会有一个列排序处于活动状态,然后删除一行
您需要将行视图转换为行模型。我认为代码应该是这样的:
int modelRow = tableConvertRowIndexToModel( selectedRow );
rowData.remove(modelRow);
fireTableRowsDeleted(modelRow, modelRow);
你不是说“0--row1--row3--2--row4”吗?是的,我理解了错误,我不知道调用getValueAt方法的是什么,但我很确定现在是这样的:表被重新绘制了,因为我触发了数据更改,就在我删除一行之后。但你的例子让我意识到了一件事:当我删除了像你的例子一样的“中间”一行时,错误从未发生过。但总是在它是模型中的最后一行时(从而导致调用getValueAt()时索引超出范围)。通过删除不同的行,列表将被重新索引,并在“已删除”索引所在的位置查找值。谢谢大家的帮助。你是不是说“0--row1 1--row3 2--row4”?是的,我理解了这个错误,我不知道是什么调用了getValueAt方法,但我很确定现在是:表被重新绘制了,因为我触发了数据更改,就在我删除了一行之后。但你的例子让我意识到了一件事:当我删除了像你的例子一样的“中间”一行时,错误从未发生过。但总是在它是模型中的最后一行时(从而导致调用getValueAt()时索引超出范围)。通过删除不同的行,列表将被重新索引,并在“已删除”索引所在的位置查找值。谢谢大家的帮助。我一直在做视图到模型行的转换,但是你的另一个建议解决了我的问题。通过保存数据、删除行和触发更改,我不需要