概要

WindowsLookAndFeelを使用するJSliderで、点線のFocusBorderを非表示に設定します。

サンプルコード

JSlider slider2 = new JSlider(0, 100, 0) {
  private transient FocusListener listener;

  @Override public void updateUI() {
    removeFocusListener(listener);
    super.updateUI();
    if (getUI() instanceof WindowsSliderUI) {
      setUI(new WindowsSliderUI(this) {
        @Override public void paintFocus(Graphics g) {
          /* empty paint */
        }
      });
      Color bgc = getBackground();
      listener = new FocusListener() {
        @Override public void focusGained(FocusEvent e) {
          setBackground(bgc.brighter());
        }

        @Override public void focusLost(FocusEvent e) {
          setBackground(bgc);
        }
      };
      addFocusListener(listener);
    }
  }
};
View in GitHub: Java, Kotlin

解説

  • Default
    • JSliderにフォーカスが移動すると、WindowsLookAndFeelのデフォルトでは目盛りなどを含む領域に黒色で点線のFocusBorderが描画される
      • MotifLookAndFeelの場合は、赤色の実線
      • MetalLookAndFeelNimbusLookAndFeelの場合はThumbの描画が変化する
  • Override SliderUI#paintFocus(...)
    • BasicSliderUI#paintFocus(...)をオーバーライドしてFocusBorderを非表示に設定
    • UIManager.put("Slider.focus", UIManager.get("Slider.background"));としてFocusBorderの色を背景色と同じにしてすべてのJSliderFocusBorderを非表示にする方法もある
    • 点線を非表示にする代わりにFocusListenerを追加してフォーカスがある場合は背景色を変更
      • WindowsLookAndFeelMetalLookAndFeelなどのようにフォーカスありでThumbの描画を変更するのはすこし面倒

参考リンク

コメント