Почему я получаю исключение в потоке "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2? - PullRequest
1 голос
/ 11 февраля 2012

Я получаю эту ошибку каждый раз, когда пытаюсь обновить данные в моем JTable:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:501)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2620)
at javax.swing.JTable.getValueAt(JTable.java:2695)
at javax.swing.JTable.prepareRenderer(JTable.java:5712)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2069)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1971)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1767)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:751)
at javax.swing.JComponent.paint(JComponent.java:1017)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5112)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
at javax.swing.JComponent._paintImmediately(JComponent.java:5060)
at javax.swing.JComponent.paintImmediately(JComponent.java:4870)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Кажется, что данные обновляются нормально, но что-то идет не так, и меня беспокоит, что это не такт даже ссылаться на любой мой код.Через некоторое время отладки я определил, что следующие строки кода вызывают проблему:

public class LoadingLogListThread extends Thread{

...

public void run() {

...
int colNo = rsmd.getColumnCount();

while(rs.next() ){
    Object[] objects = new Object[colNo];
    for(int i=0;i<colNo;i++){
        objects[i]=rs.getObject(i+1);
    }
    if( objects != null )
        aModel.addRow(objects);
    count++;
}

mainView.logEntryTable.setModel(aModel);
...

}

Поток создается и запускается, когда я нажимаю кнопку для фильтрации списка, который затем возвращается обратно.в базу данных, чтобы получить больше данных, которые могут быть за пределами того, что уже было извлечено.Позже я планирую определить, нужна ли новая выборка, и в этом случае сделаю только вышеперечисленное, а в противном случае просто отфильтрую уже полученные результаты.

1 Ответ

0 голосов
/ 25 апреля 2012

Вам необходимо обновить модель в потоке отправки событий. Вы правы, создавая новый поток для выполнения некоторых работ, особенно если данные извлекаются из базы данных. Попробуйте это:

public class LoadingLogListThread extends Thread{

...

public void run() {

...
int colNo = rsmd.getColumnCount();

while(rs.next() ){
    Object[] objects = new Object[colNo];
    for(int i=0;i<colNo;i++){
        objects[i]=rs.getObject(i+1);
    }
    if( objects != null )
        aModel.addRow(objects);
    count++;
}

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        mainView.logEntryTable.setModel(aModel);
    }

});

...

}
...