7

我想知道是否有办法知道 a JScrollBar(在我的情况下是垂直的)何时到达他的容器底部JScrollPane

起初我虽然AdjustmentListener在滚动条上使用了 ,但我不知道如何value解释JScrollBar. 此外,我不确定是否正确理解maximum代表什么以及是否可以使用该值来获取我需要的信息。

编辑

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

4 回答 4

11

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

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().addAdjustmentListener(new AdjustmentListener() {

    @Override
    public void adjustmentValueChanged(AdjustmentEvent event) {
        JScrollBar scrollBar = (JScrollBar) event.getAdjustable();
        int extent = scrollBar.getModel().getExtent();
        System.out.println("1. Value: " + (scrollBar.getValue() + extent) + " Max: " + scrollBar.getMaximum());

    }
});

或通过模型

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);

    }
});
于 2012-10-16T14:12:35.593 回答
4

@StanislavL 几乎得到了正确答案。

试试scrollBar.getValue() == scrollBar.getMaximum() - scrollBar.getVisibleAmount()

要了解为什么getVisibleAmount()需要调用,您必须首先了解 JScrollBars 是如何工作的。JScrollBar 有 4 个值:最小值、最大值、值和范围。value是滚动句柄本身的顶部,是滚动句柄extent的有效长度。value除非滚动句柄的长度为 0,否则永远不会相等maximum。为了补偿,我们必须通过减去滚动句柄的长度来调整我们比较的值以获得有效的最大值。

此处记录了此效果,这会误导性地使它听起来像是getMaximum()在按应有的方式调整值,但仔细观察JScrollBar 的实现会发现,它getMaximum()实际上给了我们真正的最大值,而不是有效的最大值。

于 2014-10-17T14:11:55.747 回答
1

通过使用 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);
    }
}
于 2012-10-16T14:13:05.873 回答
-1
scrollBar.getValue()==scrollBar.getMaximum()
于 2012-10-16T13:58:16.537 回答