JScrollBarのArrowButtonを非表示にする
Total: 2098
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JScrollBar
のArrowButton
を非表示に設定します。
Screenshot
Advertisement
サンプルコード
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);
はGTKLookAndFeel
、SynthLookAndFeel
(NimbusLookAndFeel
)でのみ有効?UIManager.put("ArrowButton.size", 8);
などを設定しても変化しない?
- 右:
ArrowButton
無しBasicScrollBarUI#createDecreaseButton(...)
、BasicScrollBarUI#createIncreaseButton(...)
メソッドをオーバーライドしてサイズ0
のJButton
を適用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); } });