概要

JScrollBarKnobの最小サイズを固定値ではなく、JScrollPaneのサイズ相対になるよう設定します。

スクリーンショット

Swing/MinimumThumbRatio.png

サンプルコード

JScrollPane scroll = new JScrollPane(textArea);
scroll.setVerticalScrollBar(new JScrollBar(Adjustable.VERTICAL) {
  @Override public void updateUI() {
    super.updateUI();
    setUI(new MetalScrollBarUI() {
      @Override protected Dimension getMinimumThumbSize() {
        Dimension d = super.getMinimumThumbSize();
        Rectangle r = SwingUtilities.calculateInnerArea(scroll, null);
        d.height = Math.max(d.height, r.height / 12);
        return d;
      }
    });
    putClientProperty("JScrollBar.fastWheelScrolling", Boolean.TRUE);
  }
});
view all

解説

  • 左: default
    • UIManager.put("ScrollBar.minimumThumbSize", new Dimension(32, 32))でノブの最小サイズを設定
      • BasicLookAndFeelNimbusLookAndFeelで有効
    • MetalLookAndFeelの場合、たとえば縦JScrollBarUIManager.getInt("ScrollBar.width")の値が高さの最小サイズになる
    • WindowsLookAndFeel(Windows 10)の場合OS(レジストリ)の設定が優先される?
    • JScrollBarのKnobの最小サイズを設定する
  • 右: override getMinimumThumbSize()
    • BasicScrollBarUI#getMinimumThumbSize()をオーバーライドして最小値を指定
    • このサンプルではJScrollBarのノブの最小サイズは可変でJScrollPaneの高さの1/12になるよう設定

参考リンク

コメント