Swing/DetectScrollToBottom の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/DetectScrollToBottom へ行く。
- Swing/DetectScrollToBottom の差分を削除
--- 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 --- * 概要 [#summary] `JScrollBar`が最後までスクロールしたかどうかを確認します。 #download(https://lh5.googleusercontent.com/-OoIPVjne_9M/UTPo6KgN_NI/AAAAAAAABlw/7miro8ywcyg/s800/DetectScrollToBottom.png) * サンプルコード [#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); } }); } }); }} * 解説 [#explanation] 上記のサンプルでは、縦`JScrollBar`から取得した`BoundedRangeModel`に`ChangeListener`を追加し、ノブの幅を加えた値が最大値になった時に最後までスクロールしたと判断して対応する`JCheckBox`を有効に設定しています。 - 縦`JScrollBar`から取得した`BoundedRangeModel`に`ChangeListener`を追加 - この`ChangeListener`でノブの幅を加えた値が最大値になった時に最後までスクロールしたと判断して対応する`JCheckBox`を有効に設定 * 参考リンク [#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`で最後までスクロールしたかを確認している * コメント [#comment] #comment #comment