java - Jtable 行排序器导致 IndexOutOfBoundsException

标签 java swing jtable indexoutofboundsexception tablerowsorter

在按列排序后的电话簿应用程序中,当我删除一行并调用 updateUI() 时,我的模型中出现了 java.lang.IndexOutOfBoundsException 。但如果不排序也不异常(exception) 我猜该对象已被删除,但在 updateUI 过程中它不知道这一点,并且根据堆栈跟踪,在某处返回旧的 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();
        }

这是堆栈跟踪:

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;
}

最佳答案

不要调用updateUI(),因为只有在 L&F 更改时才应该调用它。您的删除行方法是您模型的一部分,对吧?删除后是否触发模型的 fireXXX() 通知方法?你应该。另外,我想知道您是否应该使用迭代器来进行删除。


编辑
您声明:

No delet method is part of my controller (is it wrong?).

错了。该方法应该是表模型的一部分, Controller 可以在模型上调用此方法,但不应该有此方法。表模型应扩展 AbstractTableModel,并在删除、添加或更改数据时调用正确的 fireXXX 方法。对于删除,调用 fireTableRowsDeleted 方法,并一定要检查 AbstractTableModel API有关所有此类可用通知方法的详细信息。

I removed 'updateUI()' line ,its ok until i click on a cell of table ,when i do this he exeption thrwon . means that actually 'firexxx()' cuase it ,right?

没有。我现在不知道您的代码在做什么或异常的原因。考虑创建并发布 sscce .

Oh youre right . but Why when i call 'table.getModel()' i dont see fireXXX()'but by with a refernce to model instance it will be seen. 'mymodel.fireTableDataChanged()'

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

如果您尚未完成 JTable 教程,我建议您考虑立即执行此操作。这会对你有很大帮助。

关于java - Jtable 行排序器导致 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033336/

相关文章:

java - Android: onActivityResult() 本地数据丢失

java - 如何将 JTable 单元格输入标记为无效?

java - 即使使用 getModel 也无法向 jTable 添加行

java - 如何将 SynthLookAndFeel 与 xml 文件一起使用,其中 xml 文件路径将使用 getResourceAsStream 方法加载文件?

java - 如何从 linux 提示符中终止 java 程序

java - 如何将信息传递到 new Thread(..);

java - 将新的 JPanel 添加到另一个 JPanel 中会导致 NullPointerException

java - 从另一个 java 类调用方法会创建重复的 JPanel?

java - 如何在 JTable 中正确实现 JComboBox?

java - JTable 的单元格渲染器 - 彩色行