7
votes

Comment savoir si une JScrollBar a atteint le bas de la Jscrollpane?

J'aimerais savoir s'il y a un moyen de savoir quand un jscrollbar (vertical dans mon cas) a atteint le bas de son jscrollpane .

Au début, j'ai d'abord l'utilisation d'un ajustylistener dans la barre de défilement, mais je ne sais pas comment interpréter l'attribut du jscrollbar . De plus, je ne suis pas sûr de comprendre correctement ce que le maximum représente et si je peux utiliser avec la valeur pour obtenir les informations dont j'ai besoin.

edit : xxx


10 commentaires

@ Kleopatra Faites quelque chose quand la barre de défilement atteint le bas du volet.


Faire quelle chose? S'il vous plaît soyez plus précis quand quelqu'un pose des questions comme ça.


@Andrewthompson Je ne serais-t-il pas utile de savoir ce que je veux faire avec ces informations. La question est plus "Comment puis-je obtenir cette information".


@Andrewthompson occasionnellement (comme maintenant ;-) Je me fâche de moi-même pour essayer de comprendre les exigences supposées potentiellement asymétriques au lieu de sortir dans le dernier soleil d'automne ... Nathan: Le simple fait que je demande que je demande peut vous donner un indice que la réponse pourrait peut-être dépendre de l'utilisation de l'utilisation et / ou de l'écoute du réglable pourrait ne pas être la bonne approche dans tous les cas. Ne vous dérangerez pas, le dernier soleil d'automne attend.


@kleopatra a un beau soleil. :)


"Je ne serais-t-il pas utile de savoir" (Muses), il n'y a pas juste de comptabiliser ce que les gens pensent.


@Andrewthompson je vais y penser.


@nathan je manque de la vraie raison de cette question, quel est / sera l'objectif ..., car il me manque une conséquence avec la question et la réponse, peut-être que JScrollBar, peut-être avec RéglageListener, peut-être limiteRangemodel, peut-être Changelistener ....


@Mkorbel J'écris une discussion et j'ai besoin de savoir lorsque la barre de défilement atteint le bas ou faites défiler jusqu'à la verrouillage du message ou non.


@nathan a regardé (sujets des deux côtés)


4 Réponses :


-1
votes
scrollBar.getValue()==scrollBar.getMaximum()

2 commentaires

Hum. J'ai déjà essayé d'afficher la valeur de la propriété valeur lorsqu'un événement de réglage est viré et qu'il n'atteint jamais la valeur maximale. Donc, je pense que votre état ne sera jamais vérifié.


En utilisant cette ligne de code n'est pas nécessaire pour implémenter RéglageListener



11
votes

Vous devez ajouter l'étendue de la barre de défilement à votre calcul. J'ai ajouté le code dans votre code dans l'exemple ci-dessous.

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

    }
});


4 commentaires

Fondamentalement correct :-) Nitpicking sur l'accès au Scrollpane et la plongée profonde dans ses champs lorsque vous pouvez l'obtenir en interrogeant l'événement ...


@ Kleopatra Je suis d'accord, je viens d'essayer d'être compatible avec le style de codage que Nathan utilisait.


@ Kleopatra Pourriez-vous s'il vous plaît fournir votre réponse? :)


fonctionne très bien. Le premier extrait de code a besoin d'un support de fermeture et d'un point-virgule.



1
votes

En utilisant la fenêtre View de la JScrollPane, vous pouvez calculer si la fenêtre de visualisation affiche la fin du composant.

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


1 commentaires

Pas besoin de calculer quelque chose à partir de tailles - ajustable a toutes les informations nécessaires ;-)



4
votes

@stanislavl a presque eu la bonne réponse.

Essayez ScrollBar.getvalue () == ScrollBar.getMaximum () - ScrollBar.getVissiblemount () .

Comprendre pourquoi le getVissibleMountount () est nécessaire, vous devez d'abord comprendre comment le travail JScrollBars. Une JScrollBar a 4 valeurs: minimum, maximum, valeur et étendue. Valeur est le haut de la poignée de défilement elle-même et est la longueur effective de la poignée de défilement. valeur ne sera jamais égal maximum sauf si la poignée de défilement a une longueur de 0. Pour compenser, nous devons ajuster la valeur que nous comparons à la soustraction de la longueur de la poignée de défilement vers Obtenez le maximum effectif.

Cet effet est documenté ici < / a>, qui fait trompeusement cela sonner comme getMaximum () ajuste la valeur comme si elle devrait, mais en regardant de près le implémentation de JScrollBar montre que getmaximum () nous donne réellement le maximum réel, pas le maximum effectif.


1 commentaires

Ce merveilleux doublure devrait sûrement être la réponse! Une réponse simple sans fenêtre, etc. Merci beaucoup après presque 2 ans!