Swing/UninstallListeners の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/UninstallListeners へ行く。
- Swing/UninstallListeners の差分を削除
--- 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