Jtable行分类器导致IndexOutOfBoundsException

时间:2013-08-03 13:23:55

标签: java swing jtable indexoutofboundsexception tablerowsorter

在我的PhoneBook applcation中按列排序后,当我删除一行并且cal updateUI()时,我的模型中有一个java.lang.IndexOutOfBoundsException。但如果没有排序则没有例外 我想这个对象已被删除,但在updateUI过程中,根据stacktrace,它不知道并且在某处返回旧的getRowCount()

    private void delete(int[] selectedIndexes) {
            ArrayList<Contact> arlDeleting = new ArrayList<Contact>();
            for (int i = selectedIndexes.length - 1; i >= 0; i--) {
                int realIndex = tblPhonebook.convertRowIndexToModel(selectedIndexes[i]);
                tblMdlAllContacts.getData().remove(realIndex);
            }

            tblPhonebook.updateUI();
        }

这里是stacktrace:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.TableModelPhoneBook.getValueAt(TableModelPhoneBook.java:73)     ***
at javax.swing.JTable.getValueAt(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)           *** i think getRowCount called here
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$700(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

和model.getvalueat:

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Contact temp = data.get(rowIndex);                 // here is where error occurs
    switch (columnIndex) {
    case 0:
        return temp.getFirstName();
    case 1:
        return temp.getLastName();
    case 2:
        return temp.getMobile();
    case 3:
        return temp.getHome();
    case 4:
        return temp.getAddress();
    default:
        break;
    }
    return null;
}

1 个答案:

答案 0 :(得分:3)

请勿拨打updateUI(),因为只有在更改L&amp; F时才应调用此fireXXX()。您的删除行方法是您的模型的一部分吗?您是否在删除后触发模型的{{1}}通知方法?你应该。另外,我想知道你是否应该使用迭代器进行删除。


修改
你说:

  

没有delet方法是我的控制器的一部分(是不是?)。

错误。该方法应该是表模型的一部分,并且控制器可以在模型上调用此方法,但不应该使用此方法。表模型应该扩展AbstractTableModel,并且应该在删除,添加或更改数据时调用正确的fireXXX方法。对于删除,请调用fireTableRowsDeleted方法,并明确检查AbstractTableModel API以获取有关所有此类可用通知方法的详细信息。

  

我删除了'updateUI()'行,它确定直到我点击表格的单元格,当我这样做时,他执行了一下。意味着实际上'firexxx()'来吧,对吧?

没有。我现在不知道你的代码在做什么或你的例外的原因。考虑创建并发布sscce

  

哦,你是对的。但为什么当我调用'table.getModel()'时,我看不到fireXXX()',但是通过引用模型实例,它将被看到。 'mymodel.fireTableDataChanged()'

外部课程不应该调用防火方法。模型本身应该是调用自己的通知方法的唯一对象。

如果你还没有完成JTable教程,我建议你考虑毫不拖延地做这件事。它会帮助你很多。