---
category: swing
folder: MinimumThumbSize
title: JScrollBarのKnobの最小サイズを設定する
tags: [JScrollBar, UIManager, JSlider, Fixed]
author: aterai
pubdate: 2012-03-19T15:02:42+09:00
description: JScrollBarのKnobの最小サイズを設定します。
image: https://lh4.googleusercontent.com/-A8TRDbOQ1p4/T2bKeM8dcvI/AAAAAAAABKI/iBKMsL6eGfM/s800/MinimumThumbSize.png
---
* 概要 [#summary]
`JScrollBar`の`Knob`の最小サイズを設定します。

#download(https://lh4.googleusercontent.com/-A8TRDbOQ1p4/T2bKeM8dcvI/AAAAAAAABKI/iBKMsL6eGfM/s800/MinimumThumbSize.png)

* サンプルコード [#sourcecode]
#code(link){{
UIManager.put("ScrollBar.minimumThumbSize", new Dimension(32, 32));
}}

* 解説 [#explanation]
- 左: デフォルト
- 右: `JScrollBar`のつまみ(`Thumb`、`Knob`)に最小サイズを設定
-- `Horizontal`の場合の最小サイズは幅、`Vertical`の場合は高さ
- `LookAndFeel`によって`UIManager.put("ScrollBar.minimumThumbSize", new Dimension(32, 32));`が有効かどうかは異なる
-- 有効: `BasicLookAndFeel`、`WindowsLookAndFeel`、`NimbusLookAndFeel`(`Java 8`以上?)
-- 無効: `MetalLookAndFeel`、%%`NimbusLookAndFeel`%%
--- 以下のように縦スクロールバーならその幅が最小サイズになるよう上書きされているため`ScrollBar.minimumThumbSize`を設定しても効果がない
#code{{
// @see javax/swing/plaf/metal/MetalScrollBarUI.java
protected Dimension getMinimumThumbSize() {
  return new Dimension(scrollBarWidth, scrollBarWidth);
}
}}

- 確実にノブの最小サイズを設定したい場合は`BasicScrollBarUI#getMinimumThumbSize()`をオーバーライドして最小値を指定するしかなさそう
-- [[JScrollBarのKnobの最小サイズをJScrollPaneのサイズ相対に変更する>Swing/MinimumThumbRatio]]

----
- `JDK 1.8.0_20`で修正されて、この記事のスクリーンショットのようにノブのサイズが小さくなり過ぎることはなくなった
-- `WindowsScrollBarUI`(`XPStyle`)が修正された
-- [https://bugs.openjdk.org/browse/JDK-8039464 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

- 参考: [https://stackoverflow.com/questions/2754306/java-swing-rendering-bug-on-windows-7-look-and-feel Java Swing rendering bug on Windows 7 look-and-feel? - Stack Overflow]
-- `slider.setPaintTicks(true)`とした場合は、正常なサイズで描画される
- [[JSliderのつまみの形状を変更>Swing/ThumbArrowShape]]
-- トラックを表示したくない場合は、`slider.putClientProperty("Slider.paintThumbArrowShape", Boolean.TRUE);`で、つまみの形だけ変更

----
- `Windows 11`環境では`UIManager.put("ScrollBar.minimumThumbSize", new Dimension(32, 32))`を設定しても無効?

* 参考リンク [#reference]
- [https://stackoverflow.com/questions/2754306/java-swing-rendering-bug-on-windows-7-look-and-feel Java Swing rendering bug on Windows 7 look-and-feel? - Stack Overflow]
- [[JSliderのつまみの形状を変更>Swing/ThumbArrowShape]]
- [[JScrollBarのKnobの最小サイズをJScrollPaneのサイズ相対に変更する>Swing/MinimumThumbRatio]]

* コメント [#comment]
#comment
#comment