8
votes

Comment faire défiler jusqu'à un emplacement spécifique dans un jscrollpane

J'ai un jscrollpane qui contient un JPANEL qui a une grande hauteur, ce grand JPanel contient plus de jannels de l'image comme dans l'image. Certains de ces panneaux contiennent un jlabel que j'avais l'habitude de montrer des titres. En haut, il y a des jlabels qui ont des chiffres correspondant aux numéros de titre des étiquettes de titre. Ce que je dois faire, c'est quand je clique sur une étiquette dans la liste des étiquettes supérieure, la barre JScroll doit faire défiler jusqu'à la position où cette étiquette est placée.

Je ne sais pas si cela est possible ou non, mais si quelqu'un sache comment faire défiler jusqu'à une position spécifique dans un jscrollpane, veuillez m'aider.

Entrez la description de l'image ici


1 commentaires

J'ai trouvé une solution et cela fonctionne bien ce que je faisais, je reçois la position Y de l'étiquette d'en-tête dont j'ai besoin, puis appelle la méthode de Follwing de Jscrollpane, jscrollpane.geviewport (). SetviewPosition (nouveau point (0, [position Y de l'étiquette d'en-tête]));


3 Réponses :


7
votes

C'est faisable.

Vous aurez besoin d'une référence sur le jlabel code> dans l'en-tête et où il se lie à votre vue ( jPanel code>). Une fois que vous avez ce lien, vous pouvez avoir besoin de déterminer l'emplacement du jlabel code> dans le "jPanel". P>

Vous pouvez utiliser le jvieport.scrollrectTOVISIBLE (rectangle) code> méthode pour faire défiler cet emplacement. P>

JLabel labelInPane = //... reference lookup
Rectangle bounds = labelInPane.getBounds();
// You may need to convert the point to meet the requirements of the parent container...
// bounds.setLocation(SwingUtilities.convertPoint(labelInPane, bounds.getPoint(), topLevelParentPaneInScrollPane));

scrollPane.getViewport().scrollRectToVisible(bounds);


8 commentaires

ou changer le rectangle directement aux liaisons Jlabels


@mkorbel Tu as raison ... l'avait eu dans ma tête qui pourrait avoir la possibilité de déplacer la fenêtre de vue de sorte que l'étiquette apparaisse au bas de la vitre de défilement ... mais évidemment c'est juste une discussion folle: P


-1 Pour trop compliqué (TSSS ... Encore un autre cas d'une erreur extrêmement collante;): étiquette.scrollrectTOVISIBLE (label.getbounds ()) est tout ce qui est nécessaire.


@ Keopatra, bien sûr, nous supposons que l'étiquette en question repose sur le conteneur de niveau supérieur dans le JVIEWPORT, si oui, vous êtes tous les deux corrects et je suis d'accord, mais si le label TE était contenu dans un ou plusieurs autres enfants des conteneurs, je ne crois pas que ce serait, d'où la composante sur la conversion du point, mais vous n'avez pas besoin de la mention de visibilité des ports de vue


Pas une question de croyance - c'est un fait les enfants profonds-profonds-profonds sont traités dans la mise en œuvre par défaut ;-)


@ Kleopatra Je suis désolé, je suis évidemment juste un idiot, mais je ne peux pas obtenir ce que vous dites au travail (je viens de passer 2 heures à jouer avec elle). Je suis peut-être mal compris ce que vous essayez de dire. Je dispose un jPanel , contenant 100 jPanels , chacun avec un seul jlabel . Maintenant, selon la façon dont je comprends ce que vous dites, je devrais pouvoir nous dire jlabel.gettbounds avec ScrollrectTOVISIBLE - Je n'ai pas pu obtenir cela pour travailler, en fait le seul manière que je puisse le faire au travail était de convertir l'emplacement du composant avec une référence à la fenêtre et de passer cela dans - Suis-je manque quelque chose d'évident: p


Quelque chose ne va pas avec le code que vous n'êtes pas montrant juste à deux reprises: Works-for-Me (ajoutera un extrait à ma réponse)


@ Kleopatra PS - Les problèmes non avec le code, c'est avec le codeur;)



9
votes

en supposant que vous souhaitiez que l'ensemble du panneau contienne l'étiquette comme le titre soit visible:

final JLabel last = new JLabel("I'm the last");

int maxRow = 20;
int maxColumn = 10;

JComponent content = new JPanel(new GridLayout(maxRow, maxColumn));
for (int row = 0; row < maxRow; row++) {
    for (int column = 0; column < maxColumn; column++) {
        JComponent parent = new JPanel();
        JLabel label = new JLabel("i'm in " + row + "/" + column);
        if (row == (maxRow - 1) && column == (maxColumn - 1)) {
            label = last;
            last.setBorder(BorderFactory.createLineBorder(Color.RED));
        }
        parent.add(label);
        content.add(parent);
    }
}
JXFrame frame = wrapWithScrollingInFrame(content, "scroll");
Action action = new AbstractAction("scrollLastVisible") {

    @Override
    public void actionPerformed(ActionEvent e) {
        last.scrollRectToVisible(last.getBounds());
    }
};
addAction(frame, action);
show(frame, frame.getPreferredSize().width / 2, frame.getPreferredSize().height / 2);
  • Le composant Le ScrollCrectTuVisible est invoqué a une implémentation personnalisée (comme F.I. Composants de texte LI>
  • Si l'emplacement par défaut atteint par cette méthode n'est pas à la hauteur de votre goût li> ul>

    edit strud> p>

    Un extrait de code pour @madprogrammer :-) - mais trop paresseux pour supprimer toutes les traces de Swokx, alors voilà: P >

    Container parent = titleLabel.getParent();
    parent.scrollRectToVisible(parent.getBounds());
    


4 commentaires

Ahh, je vois savoir, définitivement idiot sur le côté de l'extérieur. Je supposais que le rectangle était relatif au volet de défilement. - Je vais ajouter ça à mon petit livre noir de trucs. Merci (maintenant j'ai envie de supprimer ma réponse: p)


PS Je sais que vous n'en avez pas besoin, mais +1 - honte que je ne puisse pas voter pour plus;)


Ce n'est pas correct. conteneur parent = titlelabel.getparent (); parent.scrollrectTuveysible (parent.getbounds ()); Il n'y a pas de méthode nommée ScrollRectTuVisible sur le conteneur .


@ SearchEngine27 Ouais, vous avez raison: c'est une méthode sur JComponent, a besoin d'une forme de type (qui est suffisamment sûre parce que nous savons que nous l'avons ajouté à un JPanel). Merci pour la tête, n'hésitez pas à éditer avec la correction :)



3
votes

ScrollRectToVisible ne fonctionne pas pour moi. Mais j'ai résolu de cette façon:

AbstractNode a = pkmap.get(0);
scroll.getVerticalScrollBar().setValue(a.getY());
scroll.getHorizontalScrollBar().setValue(a.getX());


0 commentaires