• 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

概要

MouseListenerMouseMotionListenerなどを削除することで、JSliderへの入力操作を制限します。

サンプルコード

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);
  }
};
View in GitHub: Java, Kotlin

解説

  1. デフォルトのJSlider
  2. JSlider#setEnabled(false)で無効化
    • 表示が変更されて(灰色)、無効状態をユーザーにフィードバック
  3. BasicSliderUI#uninstallListeners(...)BasicSliderUI#uninstallKeyboardActions(...)メソッドをリフレクションでアクセス可能に変更して実行
    • 参考: JSlider Problem | Oracle Community
    • 無効状態ではないので、ノブなどが灰色にならない
    • ComponentListenerなども削除されるので、リサイズしても表示は不変
  4. getMouseListeners()などで取得したリスナーを削除
    • MouseListenerMouseMotionListenerを削除
    • キー入力は、setFocusable(false)で無効化(InputMapには、JComponent.WHEN_FOCUSEDで登録されているのでフォーカスがなければキー入力できない)

参考リンク

コメント