2012-05-01 55 views
0

我有一个JPanel,并在该面板内JComboBoxJTable(与TableRowSorter)。我的JComboBox有一些数据在里面。如果用户从JComboBox中选择了一些内容,则JTable将填充所选数据。我还将ListSelectionListener添加到JTable以收听选择,并根据JTable选择采取适当的操作。ArrayIndexOutOfBoundsException当排序JTable

下面是测试场景(为了事项):

  1. 用户选择从JComboBox中的东西。
  2. JTable会使用选定的数据填充。
  3. 用户通过点击一个行
  4. 用户试图选择的项目从JComboBox中再次
  5. 应用程序崩溃选择来自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例证。

Illustration of the problem

这里是ListSelectionListenervalueChanged点的方法:

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

任何帮助将不胜感激。

回答

3

特定值-1回忆JComboBox使用的哨点表示没有选择sscce会有所帮助,但您可以在调试器中看到它。

两个相关的问题出现了:

  1. 为什么一个明显boolean谓词,isRowSelected(),返回int

  2. 为什么重写fireValueChanged()观察ListSelectionListener

+0

isRowSelected()返回所选行(错误的方法命名)。另外,我没有重写fireValueChanged()? – 629

+0

我想我误读了'valueChanged()'附近的堆栈跟踪。 – trashgod

+0

我只通过扩展AbstractTableModel实现了'TableModel'(你可以在代码中看到'SearchScoutTableModel'),并且还覆盖了'valueChanged()@ListSelectionListener'来获取选定的行,并启用'Submit'按钮当用户从表中选择一行时。我在第一篇文章中添加了重写方法。我没有添加/修改任何JComboBox侦听器,也没有将任何动作侦听器添加到该JComboBox。 – 629