26

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

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

4

2 に答える 2

50

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

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

2. 選択を変更するために、マウスを放さずにドラッグする場合があります。
リストは、選択を変更するたびに追加のイベントを発生させ
ます。まだ変更を行っているため、これらのイベントのそれぞれに対して getValueIsAdjusting も true になります。

3. マウスを放します
- リストが最終イベントを発生させます - 選択操作が終了し
ます - getValueIsAdjusting=false これで、最終選択でやりたいことは何でもできます

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

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

于 2012-09-17T14:53:58.587 に答える
32

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

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

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

    }

}                                     
于 2014-08-22T13:52:40.657 に答える