Сортировщик строк Jtable вызывает IndexOutOfBoundsException

В моем приложении PhoneBook после сортировки по столбцу, когда я удаляю строку и вызываю updateUI(), я получаю java.lang.IndexOutOfBoundsException в своей модели. Но если не сортировать, исключения нет, я предполагаю, что объект был удален, но в процедуре 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;
}

person Reza Gh    schedule 03.08.2013    source источник


Ответы (1)


Не вызывайте updateUI(), поскольку его следует вызывать только при изменении L&F. Ваш метод удаления строки является частью вашей модели, верно? Вы запускаете методы уведомления модели fireXXX() после удаления? Вы должны быть. Кроме того, мне интересно, следует ли вам использовать итератор для удаления.


Изменить
Вы заявляете:

Метод удаления не является частью моего контроллера (это неправильно?).

Неправильно. Метод должен быть частью вашей модели таблицы, и контроллер может вызывать этот метод в модели, но не должен иметь этот метод. Модель таблицы должна расширять AbstractTableModel и вызывать соответствующий метод fireXXX при удалении, добавлении или изменении данных. Для удаления вызовите метод fireTableRowsDeleted и обязательно проверьте AbstractTableModel API для получения подробной информации обо всех таких доступных методах уведомления.

Я удалил строку «updateUI ()», все в порядке, пока я не нажму на ячейку таблицы, когда я это сделаю, он исключит исключение. означает, что на самом деле это 'firexxx()', верно?

Нет. Я понятия не имею, что делает ваш код или причина ваших исключений прямо сейчас. Попробуйте создать и опубликовать sscce.

О, ты прав. но почему, когда я вызываю table.getModel(), я не вижу fireXXX(), но со ссылкой на экземпляр модели это будет видно. 'моямодель.fireTableDataChanged()'

Внешние классы не должны вызывать методы огня. Сама модель должна быть единственным объектом, вызывающим собственные методы уведомления.

Если вы еще не ознакомились с учебным пособием по JTable, я предлагаю вам рассмотреть возможность сделать это без промедления. Это очень поможет вам.

person Hovercraft Full Of Eels    schedule 03.08.2013
comment
Никакой метод удаления не является частью моего контроллера (это неправильно?). Я удалил строку «updateUI ()», все в порядке, пока я не нажму на ячейку таблицы, когда я это сделаю, он исключит исключение. означает, что на самом деле это 'firexxx()', верно? - person Reza Gh; 03.08.2013
comment
О, ты прав. но почему, когда я вызываю table.getModel(), я не вижу fireXXX(), но со ссылкой на экземпляр модели это будет видно. 'моямодель.fireTableDataChanged()' - person Reza Gh; 03.08.2013
comment
Вы знаете хороший учебник, кроме документов Oracle - такой короткий и практичный!? - person Reza Gh; 04.08.2013