2012-04-13 50 views
0

JavaのGUIアプリケーションで、値がjListに追加されたときにIndexOutOfBoundsExceptionsが発生することがあります。jListのselectedIndexがコレクションのサイズよりも大きいのはなぜですか?

値が選択され、別の値が追加された場合は例外が発生しているようです。ユーザーがインデックスを選択したときに何かが発生する必要があるため、選択値の変更のためのリスナーがありますが、この値は新しい値が追加されたときに発生します。私はちょうどAbstractListModelを拡張するカスタムListModelを使用し、完全に有効な方法で必要なメソッドをオーバーライドします。

  1. 値がリストに追加されたときにプログラムで選択が変更されるのはなぜですか?これは視覚的に表現されていません。
  2. なぜ実際には存在しないインデックスをjListで選択できるのですか?

私は最近jListを2回使用しています(私たちは最近、学校でGUIを始めました)、私は両方の問題を抱えていました。初めて値を追加する前に選択をクリアして解決しましたが、それは本当に良い解決策ではありません。私はこれが必要であるとは思わない。

なぜこのようなことが起こるかはわかりませんが、奇妙なコードなどはありません。私はそれは本当に関係のないことだと思うので、私は今より多くのコードを提供していないよ

listmodel.addValue(object); 
listmodel.fireIntervalAdded(); 
//selection event occurs 
selectedObject = listmodel.getValueAt(list.getSelectedIndex()); //indexoutofboundsexception 
//index = 5, size = 3 (for example) when there are 2 objects in list and first is selected. 

:擬似コードでは、これは何が起こるかです。私は、jList、そのlistmodelとその選択モデルがどのように機能しているかを完全に理解している人なら、何が間違っているのか理解していると思います。これに関する助けに感謝します。

+0

私はあなたの 'ListModel'を見るでしょう。どういうわけか 'JList'はあなたの' ListModel'と同期していません。おそらくあなたは 'ListModel'ソースを投稿することができます。 –

+0

listmodelは非常に簡単です。アイテムを格納するarraylistがあります(これは適切なコレクションではないかもしれません)。オブジェクトの追加、オブジェクトの削除、インデックスの削除、オブジェクトの取得、およびオブジェクトのインデックスの取得という5つのメソッドしかありません。これらのメソッドのうちの4つは、arraylistで適切なメソッドを呼び出すだけです。アイテムが削除されると、私は 'fireIntervalRemoved(this、0、list.size());'を実行し、アイテムが追加されたときに 'fireIntervalAdded(this、0、list.size());'を実行してから、 arrayListそれを考えると、並べ替えは問題の原因になる可能性があります。 – MarioDS

+0

注意:_do not_モデル外のコードからfireXXメソッドを呼び出す - リスナーに通知することは、**モデルの基本的な責任ですそれ自体、addValueメソッドで実装する必要があります – kleopatra

答えて

3

単一のアイテムがリストモデルに追加されたときには、fireIntervalAdded(this, 0, list.size())を呼び出す可能性が最も高いです。 signatureは:

protected void fireIntervalAdded(Object source, int index0, int index1) 

index0が追加されたアイテムの開始インデックスであり、index1が終了インデックスであること。したがって、単一の項目の場合、index0index1と同じでなければなりません。​​を0, list.size()と呼ぶと、N個のアイテムが追加されたことをJListに伝えます(N = list.size())。したがって、JListはあなたのリストモデルより多くのアイテムがあると考えます。

アイテムを削除するときも同じです。

+0

私はそのメソッドを本当に理解したことはありません。 javadocによると、index1はindex0より大きい必要はありません。選択されたインデックスがサイズ-1より大きいかどうかを確認するために、イベントハンドラにチェックを追加して問題を解決しました。本当の問題があるかどうかを確認します。 – MarioDS

+0

それは、あなたに感謝します。私は本当にこれについて教師を責めていますが、実際にどのくらい変わったかは本当に気にしていなかったので、リスト全体でこれらの出来事を起こすのは大丈夫だと言いました。確かにささいなことだ。どうもありがとう!! – MarioDS

関連する問題