概要

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 all

解説

  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で登録されているのでフォーカスがなければキー入力できない)

参考リンク

コメント