• category: swing folder: AlwaysShowThumb title: JScrollBarのノブを常に表示する tags: [JScrollBar, UIManager, LookAndFeel] author: aterai pubdate: 2022-03-28T07:58:55+09:00 description: JScrollBarのノブの長さがトラックと同じ長さになっても非表示にせず、常に表示されるよう設定します。 image: https://drive.google.com/uc?id=1BeoM_Wcry_psyXpkeTSdy9Wh0nDP_XtW

概要

JScrollBarのノブの長さがトラックと同じ長さになっても非表示にせず、常に表示されるよう設定します。

サンプルコード

// UIManager.put("ScrollBar.alwaysShowThumb", Boolean.TRUE);
JScrollPane scroll = new JScrollPane(new JTree());
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

String key = "ScrollBar.alwaysShowThumb";
JCheckBox check = new JCheckBox(key) {
  @Override public void updateUI() {
    super.updateUI();
    EventQueue.invokeLater(() ->
        setSelected(UIManager.getLookAndFeelDefaults().getBoolean(key)));
  }
};
check.addActionListener(e -> {
  UIManager.getLookAndFeelDefaults().put(key, check.isSelected());
  SwingUtilities.updateComponentTreeUI(scroll);
});
View in GitHub: Java, Kotlin

解説

  • UIManager.put("ScrollBar.alwaysShowThumb", Boolean.TRUE)
    • GTKLookAndFeelのデフォルト
    • GTKLookAndFeel以外でもUIManager.put("ScrollBar.alwaysShowThumb", Boolean.TRUE)を設定すればJScrollBarのノブが常に表示状態になる
    • スクロールバーポリシーがScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYSScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS以外の場合はJScrollBar自体が非表示になるのでこの設定は無意味になる
  • UIManager.put("ScrollBar.alwaysShowThumb", Boolean.False)
    • GTKLookAndFeel以外のデフォルト
    • 例えばJScrollPaneのビューコンテンツの高さがJViewportの高さより小さく全高が表示されてスクロールの必要がない場合は、JScrollBarのノブは非表示になる

参考リンク

コメント