Java 如何知道JScrollBar是否已到达JScrollPane的底部?

Java 如何知道JScrollBar是否已到达JScrollPane的底部?,java,swing,jscrollpane,jscrollbar,Java,Swing,Jscrollpane,Jscrollbar,我想知道是否有办法知道一个JScrollBar(在我的例子中是垂直的)何时到达了它所包含的JScrollPane的底部 起初我想在滚动条上使用一个AdjustmentListener,但我不知道如何解释JScrollBar的value属性。此外,我不确定是否正确理解最大值代表什么,以及是否可以使用该值来获取所需的信息 编辑: scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

我想知道是否有办法知道一个
JScrollBar
(在我的例子中是垂直的)何时到达了它所包含的
JScrollPane
的底部

起初我想在滚动条上使用一个
AdjustmentListener
,但我不知道如何解释
JScrollBar
value
属性。此外,我不确定是否正确理解
最大值
代表什么,以及是否可以使用该值来获取所需的信息

编辑

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
    @Override
    public void adjustmentValueChanged(AdjustmentEvent ae) {
        System.out.println("Value: " + scrollPane.getVerticalScrollBar().getValue() + " Max: " + scrollPane.getVerticalScrollBar().getMaximum());
    }
}

您必须将滚动条的范围添加到计算中。我在下面的示例中将代码添加到您的代码中

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
    @Override
    public void adjustmentValueChanged(AdjustmentEvent ae) {
        int extent = scrollPane.getVerticalScrollBar().getModel().getExtent();
        System.out.println("Value: " + (scrollPane.getVerticalScrollBar().getValue()+extent) + " Max: " + scrollPane.getVerticalScrollBar().getMaximum());
    }
});
两种备选方案(部分对Kleopatra作出反应)

或者通过模型

scrollPane.getVerticalScrollBar().getModel().addChangeListener(new ChangeListener() {

    @Override
    public void stateChanged(ChangeEvent event) {
        BoundedRangeModel model = (BoundedRangeModel) event.getSource();
        int extent = model.getExtent();
        int maximum = model.getMaximum();
        int value = model.getValue();

        System.out.println("2. Value: " + (value + extent) + " Max: " + maximum);

    }
});

通过使用JScrollPane的视口,可以计算视口是否正在查看组件的末端

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class ViewPortDemo extends JPanel{

    public ViewPortDemo(){
        super();
        JTree tree = new JTree();
        for(int i =0; i < tree.getRowCount(); i++){
            tree.expandRow(i);
        }

        final JScrollPane pane = new JScrollPane(tree){
            Dimension prefSize = new Dimension(200,150);
            public Dimension getPreferredSize(){
                return prefSize;
            }
        };

        pane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                JViewport vp = pane.getViewport();
                if(vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y){
                    System.out.println("End");
                }
            }
        });

        add(pane);
    }


    public static void main(String[] args){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ViewPortDemo());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类ViewPortDemo扩展了JPanel{
公共视口演示(){
超级();
JTree树=新的JTree();
对于(int i=0;i如果(vp.getView().getHeight()@StanislavL)几乎得到了正确的答案

请尝试
scrollBar.getValue()==scrollBar.getMaximum()-scrollBar.getVisibleMount()

要了解为什么
getVisibleMount()
调用是必要的,您必须首先了解JScrollBar的工作原理。JScrollBar有4个值:最小值、最大值、值和范围。
value
是滚动手柄本身的顶部,
extent
是滚动手柄的有效长度。
value
永远不会等于
max
,除非滚动手柄长度为0。为了进行补偿,我们必须通过减去滚动手柄的长度来调整比较的值,以获得有效的最大值


这种效果被记录在案,这让它听起来像是
getMaximum()
调整了它应该调整的值,但仔细看一下显示
getMaximum()
实际上给出的是真正的最大值,而不是有效的最大值。

哼。我已经尝试在触发调整事件时显示value属性的值,但它从未达到最大值。因此我认为您的情况永远不会得到验证。只要滚动条到达底部,使用此代码行@kleopatra,就可以做些事情做什么?当有人问这样的问题时,请更具体一些。@AndrewThompson我想知道我想用这些信息做什么是没有用的。问题更多的是“我如何获得这些信息”。@AndrewThompson偶尔(比如现在;-)我为自己试图理解可能扭曲的假设需求而生气,而不是在去年秋天的阳光下外出……内森:我问的仅仅是一个事实可能会给你一个暗示,也许答案可能取决于用例和/或听可调的可能不是所有情况下的正确方法。我不会再麻烦你了n、 最后一个秋天的太阳正在等待。@kleopatra有一个可爱的阳光。:)基本正确:-)当你可以通过查询事件来达到同样的效果时,挑剔访问滚动窗格并深入查看其字段…@kleopatra我同意,我只是尝试与nathan使用的编码风格保持一致。@kleopatra你能提供你的答案吗?:)效果很好。第一个代码段需要一个右括号和分号。无需根据尺寸计算一些东西-可调有所有需要的信息;-)这个很棒的一行肯定会是答案!一个没有视口等的简单答案。近2年后非常感谢!
scrollPane.getVerticalScrollBar().getModel().addChangeListener(new ChangeListener() {

    @Override
    public void stateChanged(ChangeEvent event) {
        BoundedRangeModel model = (BoundedRangeModel) event.getSource();
        int extent = model.getExtent();
        int maximum = model.getMaximum();
        int value = model.getValue();

        System.out.println("2. Value: " + (value + extent) + " Max: " + maximum);

    }
});
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class ViewPortDemo extends JPanel{

    public ViewPortDemo(){
        super();
        JTree tree = new JTree();
        for(int i =0; i < tree.getRowCount(); i++){
            tree.expandRow(i);
        }

        final JScrollPane pane = new JScrollPane(tree){
            Dimension prefSize = new Dimension(200,150);
            public Dimension getPreferredSize(){
                return prefSize;
            }
        };

        pane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                JViewport vp = pane.getViewport();
                if(vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y){
                    System.out.println("End");
                }
            }
        });

        add(pane);
    }


    public static void main(String[] args){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ViewPortDemo());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}