概要

JScrollBarArrowButtonを非表示に設定します。

サンプルコード

UIManager.put("ScrollBar.width", 10);
UIManager.put("ScrollBar.thumbHeight", 20); // GTK, SynthLookAndFeel
UIManager.put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
UIManager.put("ScrollBar.incrementButtonGap", 0);
UIManager.put("ScrollBar.decrementButtonGap", 0);

JScrollPane scroll = new JScrollPane(new JTextArea(txt)) {
  @Override public void updateUI() {
    super.updateUI();
    getVerticalScrollBar().setUI(new ArrowButtonlessScrollBarUI());
    getHorizontalScrollBar().setUI(new ArrowButtonlessScrollBarUI());
  }
};
// ...

class ZeroSizeButton extends JButton {
  private static final Dimension ZERO_SIZE = new Dimension();

  @Override public Dimension getPreferredSize() {
    return ZERO_SIZE;
  }
}

class ArrowButtonlessScrollBarUI extends BasicScrollBarUI {
  @Override protected JButton createDecreaseButton(int orientation) {
    return new ZeroSizeButton();
  }

  @Override protected JButton createIncreaseButton(int orientation) {
    return new ZeroSizeButton();
  }

  // @Override protected Dimension getMinimumThumbSize() {
  //   // return new Dimension(20, 20);
  //   return UIManager.getDimension("ScrollBar.minimumThumbSize");
  // }

  // ...
}
View in GitHub: Java, Kotlin

解説

  • 左: ArrowButton有り(デフォルト)
    • UIManager.put("ScrollBar.width", 10);JScrollBarの幅を変更
    • ArrowButtonのアイコンサイズは変更されず?、微妙にずれてしまう
    • UIManager.put("ScrollBar.thumbHeight", 20);GTKLookAndFeelSynthLookAndFeel(NimbusLookAndFeel)でのみ有効?
      • UIManager.put("ArrowButton.size", 8);などを設定しても変化しない?
  • 右: ArrowButton無し
    • BasicScrollBarUI#createDecreaseButton(...)BasicScrollBarUI#createIncreaseButton(...)メソッドをオーバーライドしてサイズ0JButtonを適用
    • JButton#setVisible(false);の場合、ArrowButtonは非表示になるがJScrollBarに余白が残る
    • UIManager.put("ScrollBar.squareButtons", Boolean.TRUE);を設定するとArrowButton#getPreferredSize()が無視されてJScrollBarの幅でArrowButtonは正方形になる(非表示ではなくなる)
    • 以下のようにnew JScrollBar(Adjustable.VERTICAL)JScrollBarを作成するとトラックをクリックした場合のスクロール速度がデフォルトより遅くなる?
      JScrollPane scrollPane = new JScrollPane(new JTextArea(txt));
      scrollPane.setVerticalScrollBar(new JScrollBar(Adjustable.VERTICAL) {
        @Override public void updateUI() {
          super.updateUI();
          setUI(new ArrowButtonlessScrollBarUI());
          // ホイールでのスクロール速度は以下で速くなる
          putClientProperty("JScrollBar.fastWheelScrolling", Boolean.TRUE);
        }
      });
      

参考リンク

コメント