ArrayIndexOutOfBoundsException при сортировке JTable

У меня есть JPanelи внутри этой панели JComboBox и JTableTableRowSorter).

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

Вот тестовый сценарий (порядок имеет значение):

  1. Пользователь выбирает что-то из JComboBox.
  2. JTable заполняется выбранными данными.
  3. Пользователь выбирает строку в JTable, нажимая на строку
  4. Пользователь снова пытается выбрать элемент из JComboBox
  5. Приложение вылетает.

Примечание: если я не использую сортировщик строк, все работает как шарм.

Я получаю ArrayIndexOutOfBoundsException: -1 из строки ниже:

private int isRowSelected()
{
    return scoutTable.convertRowIndexToModel(scoutTable.getSelectedRow());
}

Вот как я установил свой сортировщик:

TableModel tableModel = new SearchScoutTableModel(scoutVector);
scoutTable.setModel(tableModel);

TableRowSorter sorter = new TableRowSorter<TableModel>(tableModel);
List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();

sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
sorter.sort();

scoutTable.setRowSorter(sorter);    
scoutTable.repaint();

Вот трассировка стека

Исключение в потоке "AWT-EventQueue-0".java:741) в userinterface.SearchScoutView.processListSelection(SearchScoutView.java:864) в userinterface.View.valueChanged(View.java:141) в javax.swing.DefaultListSelectionModel.fireValueChanged(неизвестный источник) в javax. fireValueChanged (Неизвестный источник) в javax.swing.DefaultListSelectionModel.fireValueChanged(Неизвестный источник) в javax.swing.DefaultListSelectionModel.changeSelection(Неизвестный источник) в javax.swing.DefaultListSelectionMell.LeviceSelectionMellingSelectionMellingSelectionMellingSell Неизвестный источник) в javax.swing.DefaultListSelectionModel.clearSelection (Неизвестный источник) в javax.swing.JTable.clearSelection(Неизвестный источник) в userinterface.SearchScoutView.paint(SearchScoutView.java:158) на javax.swing.JComponent.paintChildren(неизвестный источник) на javax.swing.JComponent.paint(неизвестный источник) на javax.swing.JComponent.paintChildren(неизвестный источник).swing.JComponent.paint (неизвестный источник) на javax.swing.JLayeredPane.paint(неизвестный источник) на javax.swing.JComponent.paintChildren(неизвестный источник) на javax.swing.JComponent.paint(неизвестный источник) на javax.swing.JComponent.paintToOffscreen(Неизвестный источник) в javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Неизвестный источник) в javax.swing.RepaintManager$PaintManager.paint(Неизвестный источник) в javax.swing.RepaintManager.paint.swing.JComponent._paintImmediately(неизвестный источник) на javax.swing.JComponent.paintImmediately(неизвестный источник) на javax.swing.RepaintManager.paintDirtyRegions(неизвестный источник) на javax.swing.RepaintManager.paintDirtyRegions(неизвестный источник).RepaintManager.prePaintDirtyRegions(Неизвестный источник) на Javax.swing.RepaintManager.access$700(неизвестный источник) на javax.swing.RepaintManager$ProcessingRunnable.run(неизвестный источник) на java.awt.event.InvocationEvent.dispatch(неизвестный источник) на java.awt.EventQueue.dispatchEventIventl Источник) по адресу java.awt.EventQueue.access$000(неизвестный источник) по адресу java.awt.EventQueue$3.run(неизвестный источник) по адресу java.awt.EventQueue$3.run(неизвестный источник) по адресу java.security.AccessController.doPrivileged(Собственный метод) в java.security.ProtectionDomain$1.doIntersectionPrivilege(Неизвестный источник) в java.awt.EventQueue.dispatchEvent(Неизвестный источник) в java.awt.EventDispatchThread.pumpOneEventForFilters(Неизвестный источник) в java.awpilEnt Источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy(Неизвестный источник) в java.awt.EventDispatchThread.pumpEvents(Неизвестный источник) в java.awt.EventDispatchThread.pumpEvents(Неизвестный источник) в java.awt.EventDunp.

Вот основная иллюстрация проблемы.

Иллюстрация проблемы

Вот метод, который valueChanged из ListSelectionListener точки:

public void processListSelection(EventObject evt)
{
    selectedRowIndex = isRowSelected();

    // If we have a selected row, enable the submit button; disable otherwise
    if(selectedRowIndex < 0)
    {
        submitButton.setEnabled(false);
    }
    else
    {
        //clearErrorMessage();
        submitButton.setEnabled(true);
    }
}

Любая помощь будет принята с благодарностью.

1 ответ

Особая ценность -1 напоминает стража, используемого JComboBox это указывает на отсутствие выбора. Sscce будет полезен, но вы сможете увидеть его в отладчике.

Возникают два связанных вопроса:

  1. Почему видимо boolean предикат, isRowSelected(), вернуть int?

  2. Зачем отменять fireValueChanged() и наблюдать ListSelectionListener,

Другие вопросы по тегам