• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: DetectScrollToBottom
title: JScrollBarが最後までスクロールしたことを確認する
tags: [JScrollBar, JScrollPane, ChangeListener]
author: aterai
pubdate: 2013-03-04T10:01:01+09:00
description: JScrollBarが最後までスクロールしたかどうかを確認します。
image: https://lh5.googleusercontent.com/-OoIPVjne_9M/UTPo6KgN_NI/AAAAAAAABlw/7miro8ywcyg/s800/DetectScrollToBottom.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2017/07/detects-that-it-has-reached-bottom-of.html
    lang: en
---
* 概要 [#q2d91bdc]
* 概要 [#summary]
`JScrollBar`が最後までスクロールしたかどうかを確認します。

#download(https://lh5.googleusercontent.com/-OoIPVjne_9M/UTPo6KgN_NI/AAAAAAAABlw/7miro8ywcyg/s800/DetectScrollToBottom.png)

* サンプルコード [#p3b9d209]
* サンプルコード [#sourcecode]
#code(link){{
JScrollPane scroll = new JScrollPane(c);
scroll.getVerticalScrollBar().getModel().addChangeListener(new ChangeListener() {
  @Override public void stateChanged(ChangeEvent e) {
    BoundedRangeModel m = (BoundedRangeModel)e.getSource();
    int extent  = m.getExtent();
    int maximum = m.getMaximum();
    int value   = m.getValue();
    if(value + extent >= maximum) {
      check.setEnabled(true);
    }
scroll.getVerticalScrollBar().getModel().addChangeListener(e -> {
      BoundedRangeModel m = (BoundedRangeModel) e.getSource();
      int extent = m.getExtent();
      int maximum = m.getMaximum();
      int value = m.getValue();
      if (value + extent >= maximum) {
        check.setEnabled(true);
      }
    });
  }
});
}}

* 解説 [#f9d1a4d8]
上記のサンプルでは、縦スクロールバーから取得した`BoundedRangeModel`に`ChangeListener`を追加し、ノブの幅を加えた値が最大値になった時に最後までスクロールしたと判断して、`JCheckBox`を有効に設定しています。
* 解説 [#explanation]
- 縦`JScrollBar`から取得した`BoundedRangeModel`に`ChangeListener`を追加
- この`ChangeListener`でノブの幅を加えた値が最大値になった時に最後までスクロールしたと判断して対応する`JCheckBox`を有効に設定

* 参考リンク [#j64d551e]
- [http://stackoverflow.com/questions/12916192/how-to-know-if-a-jscrollbar-has-reached-the-bottom-of-the-jscrollpane java - How to know if a JScrollBar has reached the bottom of the JScrollPane? - Stack Overflow]
-- `JScrollBar`に`AdjustmentListener`を設定する方法と、`BoundedRangeModel`に`ChangeListener`を設定する方法が回答されています。
* 参考リンク [#reference]
- [https://stackoverflow.com/questions/12916192/how-to-know-if-a-jscrollbar-has-reached-the-bottom-of-the-jscrollpane java - How to know if a JScrollBar has reached the bottom of the JScrollPane? - Stack Overflow]
-- `JScrollBar`に`AdjustmentListener`を設定する方法と、`BoundedRangeModel`に`ChangeListener`を設定する方法が回答されている
- [[JScrollBarをJSliderとして使用する>Swing/ScrollBarAsSlider]]
- [[JScrollPaneの範囲外へのマウスドラッグによるスクロールで半透明の楕円を描画する>Swing/OverscrollEdgeEffect]]
-- こちらでは`JScrollBar`ではなく、`JViewport#getView()#getSize()#height == JViewport#getViewRect()#y + JViewport#getViewRect()#height`と`JViewport`で最後までスクロールしたかを確認している

* コメント [#w83cfd99]
* コメント [#comment]
#comment
#comment