7

JScrollBar(私の場合は垂直)が彼の包含の底にいつ到達したかを知る方法があるかどうか知りたいJScrollPaneです。

最初はスクロールバーでを使用することを考えていましたが、の属性AdjustmentListenerを解釈する方法がわかりません。また、が何を表しているのか、そして必要な情報を取得するために値とともに使用できるかどうかを正しく理解することもできません。valueJScrollBarmaximum

編集

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

2つの代替実装(部分的に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 に答える