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. P>
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. P>
p>
3 Réponses :
C'est faisable.
Vous aurez besoin d'une référence sur le Vous pouvez utiliser 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>
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);
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 i> 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 code>, contenant 100
jPanels code>, chacun avec un seul
jlabel code>. Maintenant, selon la façon dont je comprends ce que vous dites, je devrais pouvoir nous dire
jlabel.gettbounds code> avec
ScrollrectTOVISIBLE code> - 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 code> code> 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
@ Kleopatra PS - Les problèmes non avec le code, c'est avec le codeur;)
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);
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());
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.
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 ()); code> Il n'y a pas de méthode nommée ScrollRectTuVisible sur le conteneur code> code>.
@ 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 :)
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());
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]));