1

В моем приложении PhoneBook после сортировки по столбцу, когда я удаляю строку и cal updateUI(), у меня есть java.lang.IndexOutOfBoundsException в моей модели. Но если не сортировка нет exeption Я предполагаю, что объект удален, но в процедуре updateUI он не знает этого и где-то возвращает старый getRowCount(), согласно stacktrace.Сортировщик строк Jtable вызывает IndexOutOfBoundsException

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

ответ

3

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


Редактировать
Вы состояние:

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

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

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

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

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

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

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

+0

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

+0

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

+0

@RezaGh: см. ответы на ваши комментарии в редакторе для ответа. –