---
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 [#summary]
`MouseListener`や`MouseMotionListener`などを削除することで、`JSlider`への入力操作を制限します。
#download(https://lh3.googleusercontent.com/-R8lyg28qxOc/VhE8l7UdVnI/AAAAAAAAODQ/XDVHIbj2uyY/s800-Ic42/UninstallListeners.png)
* Source Code Examples [#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);
}
};
}}
* Description [#explanation]
* Description [#description]
+ `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 [#reference]
- [https://community.oracle.com/threads/1360123 JSlider Problem | Oracle Community]
- [[JLayerで子コンポーネントへの入力を制限する>Swing/PopupMenuBlockLayer]]
-- `JDK 1.7.0`以降の場合、`JLayer`を使用した入力制限が可能
* Comment [#comment]
#comment
#comment