私はJPanel
を持っていて、そのパネルの中にはJComboBox
とJTable
(TableRowSorter
)があります。ArrayIndexOutOfBoundsException JTableをソートするとき
私のJComboBox
にはデータがあります。ユーザーがJComboBox
から何かを選択すると、JTable
に選択したデータが入力されます。私はまたJTable
に追加されたListSelectionListener
を持って選択を聞き、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();
は、スタックトレース
です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のイラスト。ここ
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);
}
}
任意の助けを大幅に高く評価されるだろう。
isRowSelected()は、選択した行を返します(不正なメソッドの命名)。また、fireValueChanged()をオーバーライドしませんでしたか? – 629
私は 'valueChanged()'の近くでスタックトレースを誤読したと思います。 – trashgod
私は 'AbstractTableModel'を拡張することによって' TableModel'を実装しました(コード内に 'SearchScoutTableModel'があります)、' valueChanged()@ListSelectionListener'をオーバーライドして選択行を取得し、 'Submit'ボタンを有効にしましたユーザーが表から行を選択したとき。最初の投稿にオーバーライドされたメソッドを追加しました。私はJComboBoxリスナを追加/変更せず、そのJComboBoxにアクションリスナーを追加しませんでした。 – 629