Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 原因是什么_Java - Fatal编程技术网

Java 原因是什么

Java 原因是什么,java,Java,这是我的第一个问题。首先,我是Java新手,仍然在努力理解事件。我有一个扩展AbstractTableModel的定制模型JTable,一个实现TableModelListener的定制TableModelHandler和一个定制TableCellRenderer,以显示一些定制工具提示(来自不同列的数据组合)。用户只能进行单行选择,我选中了选项autocreaterowsorter。删除行时,我使用以下方法: public void removeRow(int modelIndex) {

这是我的第一个问题。首先,我是Java新手,仍然在努力理解事件。我有一个扩展AbstractTableModel的定制模型JTable,一个实现TableModelListener的定制TableModelHandler和一个定制TableCellRenderer,以显示一些定制工具提示(来自不同列的数据组合)。用户只能进行单行选择,我选中了选项autocreaterowsorter。删除行时,我使用以下方法:

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()时索引超出范围)。通过删除不同的行,列表将被重新索引,并在“已删除”索引所在的位置查找值。谢谢大家的帮助。我一直在做视图到模型行的转换,但是你的另一个建议解决了我的问题。通过保存数据、删除行和触发更改,我不需要