我有一个JPanel
,并在该面板内JComboBox
和JTable
(与TableRowSorter
)。我的JComboBox
有一些数据在里面。如果用户从JComboBox
中选择了一些内容,则JTable
将填充所选数据。我还将ListSelectionListener
添加到JTable
以收听选择,并根据JTable
选择采取适当的操作。ArrayIndexOutOfBoundsException当排序JTable
下面是测试场景(为了事项):
- 用户选择从JComboBox中的东西。
- JTable会使用选定的数据填充。
- 用户通过点击一个行
- 用户试图选择的项目从JComboBox中再次
- 应用程序崩溃选择来自JTable中的行。
注:如果我不使用行分类器,一切都像一个魅力。从下面的线-1:
我越来越ArrayIndexOutOfBoundsException异常
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();
这里是堆栈跟踪
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source) at javax.swing.JTable.convertRowIndexToModel(Unknown Source) at userinterface.SearchScoutView.isRowSelected(SearchScoutView.java:741) at userinterface.SearchScoutView.processListSelection(SearchScoutView.java:864) at userinterface.View.valueChanged(View.java:141) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(Unknown Source) at javax.swing.DefaultListSelectionModel.clearSelection(Unknown Source) at javax.swing.JTable.clearSelection(Unknown Source) at userinterface.SearchScoutView.paint(SearchScoutView.java:158) at javax.swing.JComponent.paintChildren(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.JLayeredPane.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)
这是bas问题的ic例证。
这里是ListSelectionListener
的valueChanged
点的方法:
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);
}
}
任何帮助将不胜感激。
isRowSelected()返回所选行(错误的方法命名)。另外,我没有重写fireValueChanged()? – 629
我想我误读了'valueChanged()'附近的堆栈跟踪。 – trashgod
我只通过扩展AbstractTableModel实现了'TableModel'(你可以在代码中看到'SearchScoutTableModel'),并且还覆盖了'valueChanged()@ListSelectionListener'来获取选定的行,并启用'Submit'按钮当用户从表中选择一行时。我在第一篇文章中添加了重写方法。我没有添加/修改任何JComboBox侦听器,也没有将任何动作侦听器添加到该JComboBox。 – 629