ArrayIndexOutOfBoundsException при сортировке JTable
У меня есть JPanel
и внутри этой панели JComboBox
и JTable
(с TableRowSorter
).
мой JComboBox
есть некоторые данные в нем. Если пользователь выбирает что-то из этого JComboBox
, JTable
заполняется выбранными данными. у меня тоже есть ListSelectionListener
добавлен в JTable
прослушать выборы и принять соответствующие меры в соответствии с JTable
выбор.
Вот тестовый сценарий (порядок имеет значение):
- Пользователь выбирает что-то из JComboBox.
- JTable заполняется выбранными данными.
- Пользователь выбирает строку в JTable, нажимая на строку
- Пользователь снова пытается выбрать элемент из JComboBox
- Приложение вылетает.
Примечание: если я не использую сортировщик строк, все работает как шарм.
Я получаю 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 будет полезен, но вы сможете увидеть его в отладчике.
Возникают два связанных вопроса:
Почему видимо
boolean
предикат,isRowSelected()
, вернутьint
?Зачем отменять
fireValueChanged()
и наблюдатьListSelectionListener
,