web-dev-qa-db-ja.com

マウスを介して値が変更されると、JListはvalueChangedを2回起動します

最近、Javaで、マウスで値を変更するときにJListがvalueChanged()メソッドを2回起動し、キーボードで値を変更するときに1回だけ起動するバグに遭遇しました。 バグ オラクルのウェブサイトでこれに関して(どうやら、バグは12歳以上)そして、Oracleがこれが欠陥ではないと判断した理由を誰かが私に説明できるかどうか疑問に思っています(キーボードが使用されているときにgetValueIsAdjusting()がfalseを返すことは言うまでもありません)。

この問題を抱えている人は、getValueIsAdjusting()がfalseの場合を確認してから、残りのメソッドを実行するだけで問題を回避できることがわかりました。

22
TGP1994

簡単な説明があります。
マウスで選択を適用する場合、アクションのリストを実行します。

1。ある要素でマウスの左ボタンを押す
-リストはマウスの下の要素を選択し、最初のイベントを発生させます
-ここでも、マウスがまだ解放されていないため、getValueIsAdjusting = trueを取得します。

2。マウスを離さずにドラッグして選択を変更できます
-リストは、選択が変更されるたびに追加のイベントを発生させます
-まだ変更を加えているため、getValueIsAdjustingはこれらの各イベントにも当てはまります。

。マウスを離します
-リストは最終イベントを発生させます-選択操作は終了しました
-getValueIsAdjusting = falseこれで、最終的な選択で何でもできます

要約すると、これらの追加イベントが発生して、選択の変更時(正確には選択の変更シーケンス)のリストの動作を完全に制御できるようになります。 getValueIsAdjusting = trueの場合、選択の変更が終了したことを通知するgetValueIsAdjusting = falseの最終イベントが常に存在するため、選択の変更を無視することをお勧めします。

また、キーボタンを使用して選択を変更すると、最初にキーを押した後にリストを変更するかどうかがわからないため、そのような変更に対してgetValueIsAdjustingは常にfalseになります。

45
Mikle Garin

簡単な解決策があります:

private void jList1 ValueChanged(javax.swing.event.ListSelectionEvent evt) { 

    if (!evt.getValueIsAdjusting()) {//This line prevents double events

    }

}                                     
25
Eaglechrome