---
category: swing
folder: UninstallListeners
title: MouseListenerなどを削除してコンポーネントの入力操作を制限する
tags: [MouseListener, MouseMotionListener, JSlider]
author: aterai
pubdate: 2015-10-05T00:07:30+09:00
description: MouseListenerやMouseMotionListenerなどを削除することで、JSliderへの入力操作を制限します。
image: https://lh3.googleusercontent.com/-R8lyg28qxOc/VhE8l7UdVnI/AAAAAAAAODQ/XDVHIbj2uyY/s800-Ic42/UninstallListeners.png
---
* 概要 [#summary]
`MouseListener`や`MouseMotionListener`などを削除することで、`JSlider`への入力操作を制限します。

#download(https://lh3.googleusercontent.com/-R8lyg28qxOc/VhE8l7UdVnI/AAAAAAAAODQ/XDVHIbj2uyY/s800-Ic42/UninstallListeners.png)

* サンプルコード [#sourcecode]
#code(link){{
JSlider slider3 = new JSlider(0, 100, 50) {
  @Override public void updateUI() {
    super.updateUI();
    setFocusable(false); //uninstallKeyboardActions
    for (MouseListener l: getMouseListeners()) {
      removeMouseListener(l);
    }
    for (MouseMotionListener l: getMouseMotionListeners()) {
      removeMouseMotionListener(l);
    }
    //removeFocusListener(focusListener);
    //removeComponentListener(componentListener);
    //removePropertyChangeListener( propertyChangeListener );
    //getModel().removeChangeListener(changeListener);
    // removeFocusListener(focusListener);
    // removeComponentListener(componentListener);
    // removePropertyChangeListener( propertyChangeListener );
    // getModel().removeChangeListener(changeListener);
  }
};
}}

* 解説 [#explanation]
+ `Default`
-- デフォルトの`JSlider`
+ `JSlider#setEnabled(false)`
-- `JSlider#setEnabled(false)`で無効化
-- 表示が灰色に変更されて無効状態が視覚でユーザーにフィードバック可能
+ `BasicSliderUI#uninstallListeners(...)`
-- `BasicSliderUI#uninstallListeners(...)`、`BasicSliderUI#uninstallKeyboardActions(...)`メソッドをリフレクションでアクセス可能に変更して実行
-- 参考: [https://community.oracle.com/threads/1360123 JSlider Problem | Oracle Community]
-- 無効状態ではないので、ノブなどが灰色にならない
-- `ComponentListener`なども削除されるので、リサイズしても表示は不変
+ `JSlider#removeMouseListener(...)`
-- `getMouseListeners()`などで取得したリスナーを削除
-- `MouseListener`と`MouseMotionListener`を削除
-- キー入力は`setFocusable(false)`で無効化
--- `InputMap`には`JComponent.WHEN_FOCUSED`で登録されているのでフォーカスがなければキー入力できない

* 参考リンク [#reference]
- [https://community.oracle.com/threads/1360123 JSlider Problem | Oracle Community]
- [[JLayerで子コンポーネントへの入力を制限する>Swing/PopupMenuBlockLayer]]
-- `JDK 1.7.0`以降の場合、`JLayer`を使用した入力制限が可能

* コメント [#comment]
#comment
#comment