JScrollBarのノブ位置が境界上かどうかでその矢印ボタンの有効・無効を切り替える
Total: 1432, Today: 2, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JScrollBarのノブ位置が境界値まで到達したとき、対応する増加、減少矢印ボタンを無効化します。
Screenshot

Advertisement
Source Code Examples
// UIManager.put("ScrollBar.alwaysShowThumb", Boolean.TRUE);
JScrollPane scroll = new JScrollPane(new JTable(24, 3));
// scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
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));
boolean min = value == m.getMinimum();
Optional.ofNullable(scrollBar.getComponent(1)).ifPresent(b -> b.setEnabled(!min));
});
View in GitHub: Java, KotlinDescription
- 左: デフォルト
- 縦
JScrollBarのノブの位置が上限、または下限でも矢印ボタンの状態は変化しない
- 縦
- 右:
addAdjustmentListener- 縦
JScrollBarにAdjustmentListenerを追加してノブ位置が境界上に到達したらその矢印ボタンの有効・無効を切り替える- JScrollBarが最後までスクロールしたことを確認するのように縦
JScrollBarから取得したBoundedRangeModelにChangeListenerを追加して同様の切り替えを実行する方法もある
- JScrollBarが最後までスクロールしたことを確認するのように縦
- 縦
JScrollBar自体が無効化されている場合は考慮していない 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を取得している
- JScrollBarのノブを常に表示するや
JFrameをリサイズしてノブが表示状態になった場合、矢印ボタンの有効・無効が不正になるバグを修正
- 縦