JScrollBarのKnobの最小サイズを設定する
Total: 5981
, Today: 2
, Yesterday: 4
Posted by aterai at
Last-modified:
概要
JScrollBar
のKnob
の最小サイズを設定します。
Screenshot
Advertisement
サンプルコード
解説
- 左: デフォルト
- 右:
JScrollBar
のつまみ(Thumb
、Knob
)に最小サイズを設定Horizontal
の場合の最小サイズは幅、Vertical
の場合は高さ
LookAndFeel
によってUIManager.put("ScrollBar.minimumThumbSize", new Dimension(32, 32));
が有効かどうかは異なる- 有効:
BasicLookAndFeel
、WindowsLookAndFeel
、NimbusLookAndFeel
(Java 8
以上?) - 無効:
MetalLookAndFeel
、NimbusLookAndFeel
- 以下のように縦スクロールバーならその幅が最小サイズになるよう上書きされているため
ScrollBar.minimumThumbSize
を設定しても効果がない// @see javax/swing/plaf/metal/MetalScrollBarUI.java protected Dimension getMinimumThumbSize() { return new Dimension(scrollBarWidth, scrollBarWidth); }
- 以下のように縦スクロールバーならその幅が最小サイズになるよう上書きされているため
- 有効:
- 確実にノブの最小サイズを設定したい場合は
BasicScrollBarUI#getMinimumThumbSize()
をオーバーライドして最小値を指定するしかなさそう
JDK 1.8.0_20
で修正されて、この記事のスクリーンショットのようにノブのサイズが小さくなり過ぎることはなくなったWindowsScrollBarUI
(XPStyle
)が修正された- JDK-8039464 The scrollbar in JScrollPane has no right border if used WindowsLookAndFeel
Windows 10
はXPStyle
ではない?のでUIManager.put("ScrollBar.minimumThumbSize", ...)
は効果がない
Windows 7
のWindowsLookAndFeel
でJSlider
を使った場合も、つまみのサイズが小さすぎるが、UIManager.put("Slider.minimumHorizontalSize", new Dimension(32, 32))
などとしても効果がない?
Slider.horizontalSize Slider.verticalSize Slider.minimumHorizontalSize Slider.minimumVerticalSize Slider.horizontalThumbIcon Slider.verticalThumbIcon
- 参考: Java Swing rendering bug on Windows 7 look-and-feel? - Stack Overflow
slider.setPaintTicks(true)
とした場合は、正常なサイズで描画される
- JSliderのつまみの形状を変更
- トラックを表示したくない場合は、
slider.putClientProperty("Slider.paintThumbArrowShape", Boolean.TRUE);
で、つまみの形だけ変更
- トラックを表示したくない場合は、
Windows 11
環境ではUIManager.put("ScrollBar.minimumThumbSize", new Dimension(32, 32))
を設定しても無効?
参考リンク
- Java Swing rendering bug on Windows 7 look-and-feel? - Stack Overflow
- JSliderのつまみの形状を変更
- JScrollBarのKnobの最小サイズをJScrollPaneのサイズ相対に変更する