Technology

JListで値が固定された時のみ処理を行う

SwingでJListを配置して、アイテムが選択されたらなにかアクションをするときは、ListSelectionListener追加し、インターフェイス内のvalueChangedメソッドをOverrideして処理を書くのですが、valueChangedイベントはシングルクリックでリストを選択したとき2回呼び出されます。少し別の例を出すと、リストに複数のアイテムがあるとき、リスト上でマウスボタンを押しながら動かす(ドラッグする)と、選択しているリストアイテムがマウスポインタの位置に応じて変わりますが、そのときにもvalueChangedメソッドが呼ばれます。そして、マウスボタンを離すと、もう一度valueChangedメソッドが呼ばれます。

つまり、値が変化した時と、値が選択が終了した時(値が固定された時)にvalueChangedメソッドが呼ばれます。シングルクリックの時は、短時間にこの2つの処理が行われるので、2回呼び出されるように見えるのですね。

さて、この2つの処理を区別したいときは、ListSelectionEvent#getValueIsAdjustingメソッドを使って判定します。例えば、値が固定された時だけ処理をしたいときは、次のように書きます。

  @Override
  public void valueChanged(ListSelectionEvent lse) {
    if(lse.getValueIsAdjusting()){
      System.out.println(list.getSelectedValue());
    }
  }

getValueIsAdjustingメソッドを知っていれば、なんてことのないことですが、長期間Swingの開発から離れると忘れることもあるので、そのための備忘録のメモでした。


ただし、この方法だと、キーボード操作による選択の変更を拾えなくなります。こちらのページが参考になるかもしれません。


Topic