概要

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

参考リンク

コメント