• category: swing folder: SliderFocusBorder title: JSliderのFocusBorderを非表示に設定する tags: [JSlider, Focus, Border, WindowsLookAndFeel] author: aterai pubdate: 2017-11-27T15:20:49+09:00 description: WindowsLookAndFeelを使用するJSliderで、点線のFocusBorderを非表示に設定します。 image: https://drive.google.com/uc?export=view&id=1zvmXqQPcE3P84DbjDk0vFmBympd7es24Gw

概要

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) {}
      });
      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 SilderUI#paintFocus(...)
    • BasicSilderUI#paintFocus(...)をオーバーライドしてFocusBorderを非表示に設定
    • UIManager.put("Slider.focus", UIManager.get("Slider.background"));としてFocusBorderの色を背景色と同じにしてすべてのJSliderFocusBorderを非表示にする方法もある
    • 点線を非表示にする代わりにFocusListenerを追加してフォーカスがある場合は背景色を変更
      • WindowsLookAndFeelMetalLookAndFeelなどのようにフォーカスありでThumbの描画を変更するのはすこし面倒

参考リンク

コメント