2012-05-01 10 views
0

私はJPanelを持っていて、そのパネルの中にはJComboBoxJTableTableRowSorter)があります。ArrayIndexOutOfBoundsException JTableをソートするとき

私のJComboBoxにはデータがあります。ユーザーがJComboBoxから何かを選択すると、JTableに選択したデータが入力されます。私はまたJTableに追加されたListSelectionListenerを持って選択を聞き、JTableの選択に従って適切な処置をとる。ここで

は、テストシナリオ(注文事項)である:

  1. ユーザーは、JComboBoxのから何かを選択します。
  2. JTableには選択したデータが入力されます。
  3. ユーザー
  4. 行をクリックしてJTableのから行を選択するユーザーが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(); 

は、スタックトレース

です
 
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

valueChangedListSelectionListenerの点方法であって

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が役に立ちますが、デバッガで見ることができます。

2つの関連する疑問が生じ:

  1. なぜ明らかにboolean述語、isRowSelected()は、intを返すのですか?

  2. なぜオーバーライドfireValueChanged()は、ListSelectionListenerをご覧ください。

+0

isRowSelected()は、選択した行を返します(不正なメソッドの命名)。また、fireValueChanged()をオーバーライドしませんでしたか? – 629

+0

私は 'valueChanged()'の近くでスタックトレースを誤読したと思います。 – trashgod

+0

私は 'AbstractTableModel'を拡張することによって' TableModel'を実装しました(コード内に 'SearchScoutTableModel'があります)、' valueChanged()@ListSelectionListener'をオーバーライドして選択行を取得し、 'Submit'ボタンを有効にしましたユーザーが表から行を選択したとき。最初の投稿にオーバーライドされたメソッドを追加しました。私はJComboBoxリスナを追加/変更せず、そのJComboBoxにアクションリスナーを追加しませんでした。 – 629

関連する問題