Swing/SliderFocusBorder の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/SliderFocusBorder へ行く。
- Swing/SliderFocusBorder の差分を削除
--- 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?id=1zvmXqQPcE3P84DbjDk0vFmBympd7es24Gw --- * 概要 [#summary] `WindowsLookAndFeel`を使用する`JSlider`で、点線の`FocusBorder`を非表示に設定します。 #download(https://drive.google.com/uc?id=1zvmXqQPcE3P84DbjDk0vFmBympd7es24Gw) * サンプルコード [#sourcecode] #code(link){{ 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) {} @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); } } }; }} * 解説 [#explanation] - `Default` -- `JSlider`にフォーカスが移動すると、`WindowsLookAndFeel`のデフォルトでは目盛りなどを含む領域に黒色で点線の`FocusBorder`が描画される --- `MotifLookAndFeel`の場合は、赤色の実線 --- `MetalLookAndFeel`、`NimbusLookAndFeel`の場合は、`Thumb`の描画が変化する --- `MetalLookAndFeel`、`NimbusLookAndFeel`の場合は`Thumb`の描画が変化する - `Override SliderUI#paintFocus(...)` -- `BasicSliderUI#paintFocus(...)`をオーバーライドして`FocusBorder`を非表示に設定 -- `UIManager.put("Slider.focus", UIManager.get("Slider.background"));`として`FocusBorder`の色を背景色と同じにしてすべての`JSlider`の`FocusBorder`を非表示にする方法もある -- 点線を非表示にする代わりに`FocusListener`を追加してフォーカスがある場合は背景色を変更 --- `WindowsLookAndFeel`で`MetalLookAndFeel`などのようにフォーカスありで`Thumb`の描画を変更するのはすこし面倒 * 参考リンク [#reference] - [https://stackoverflow.com/questions/20285522/how-to-remove-the-border-of-jslider java - How to remove the Border of jSlider - Stack Overflow] * コメント [#comment] #comment #comment