Swing/DisableScrollArrowsOnBoundaryValues のバックアップの現在との差分(No.3)
- category: swing
folder: DisableScrollArrowsOnBoundaryValues
title: JScrollBarのノブ位置が境界上かどうかでその矢印ボタンの有効・無効を切り替える
tags: [JScrollBar, ArrowButton]
author: aterai
pubdate: 2022-03-21T04:17:26+09:00
description: JScrollBarのノブ位置が境界値まで到達したとき、対応する増加、減少矢印ボタンを無効化します。
image: https://drive.google.com/uc?id=1niEozeo_RPCr9KOxa4kN_gObARcoOl3o
hreflang:
href: https://java-swing-tips.blogspot.com/2022/04/disable-arrow-button-when-knob-position.html lang: en
概要
JScrollBar
のノブ位置が境界値まで到達したとき、対応する増加、減少矢印ボタンを無効化します。
Screenshot
Advertisement
サンプルコード
#spandel
JScrollPane scroll = new JScrollPane(new JTable(100, 3));
#spanend
#spanadd
// UIManager.put("ScrollBar.alwaysShowThumb", Boolean.TRUE);
#spanend
#spanadd
JScrollPane scroll = new JScrollPane(new JTable(24, 3));
#spanend
#spanadd
// scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
#spanend
scroll.getVerticalScrollBar().addAdjustmentListener(e -> {
JScrollBar scrollBar = (JScrollBar) e.getAdjustable();
BoundedRangeModel m = scrollBar.getModel();
int value = m.getValue();
boolean max = value == m.getMaximum() - m.getExtent();
Optional.ofNullable(scrollBar.getComponent(0)).ifPresent(b -> b.setEnabled(max));
Optional.ofNullable(scrollBar.getComponent(0)).ifPresent(b -> b.setEnabled(!max));
boolean min = value == m.getMinimum();
Optional.ofNullable(scrollBar.getComponent(1)).ifPresent(b -> b.setEnabled(min));
Optional.ofNullable(scrollBar.getComponent(1)).ifPresent(b -> b.setEnabled(!min));
});
View in GitHub: Java, Kotlin解説
- 左: デフォルト
- 縦
JScrollBar
のノブの位置が上限、または下限でも矢印ボタンの状態は変化しない
- 縦
- 右:
addAdjustmentListener
- 縦
JScrollBar
にAdjustmentListener
を追加してノブ位置が境界上に到達したらその矢印ボタンの有効・無効を切り替える- JScrollBarが最後までスクロールしたことを確認するでは縦
JScrollBar
から取得したBoundedRangeModel
にChangeListener
を追加して同様の切り替えを行っている - JScrollBarが最後までスクロールしたことを確認するのように縦
JScrollBar
から取得したBoundedRangeModel
にChangeListener
を追加して同様の切り替えを実行する方法もある
- JScrollBarが最後までスクロールしたことを確認するでは縦
- 縦
JScrollBar
自体が無効化されている場合は考慮していない -
JSpinner
はJSpinnerの値が境界値になった場合、ArrowButtonを無効にするのようにUIManager.put("Spinner.disableOnBoundaryValues", Boolean.TRUE)
で実現可能(BasicSpinnerUI#updateEnabledState(...)
)だが、JScrollBar
はAdjustmentListener
などを追加して実装する必要がある -
JSpinner
はJSpinnerの値が境界値になった場合、ArrowButtonを無効にするのようにUIManager.put("Spinner.disableOnBoundaryValues", Boolean.TRUE)
で実現可能(BasicSpinnerUI#updateEnabledState(...)
を参照)だが、JScrollBar
はAdjustmentListener
などを追加して実装する必要があるJSpinner
のArrowButton
はSpinner.nextButton
、Spinner.previousButton
とsetName(...)
で名前が付いているのでこれを検索して有効・無効を切り替えているが、JScrollBar
のArrowButton
はデフォルトでは未設定なのでComponent#getComponent(0)
でincrButton
、Component#getComponent(1)
でdecrButton
を取得している
-
JFrame
をリサイズしてノブが表示状態になった時点の矢印ボタンの有効・無効が正しくないバグを修正 - JScrollBarのノブを常に表示するや
JFrame
をリサイズしてノブが表示状態になった場合、矢印ボタンの有効・無効が不正になるバグを修正
- 縦