Comment faire défiler vers 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 Jpanels 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 les étiquettes JL qui ont des numéros correspondant aux numéros de titre dans les étiquettes de titre. Ce que je dois faire, c’est que lorsque je clique sur une étiquette de la liste d’étiquettes du haut, JScrollBar doit 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 sait comment faire défiler une position spécifique dans un JScrollPane, aidez-moi.

entrez la description de l'image ici

En supposant que vous souhaitiez que tout le panneau contenant l’étiquette en tant que titre soit visible:

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

Il n’est pas nécessaire d’accéder à la fenêtre contenant / scrollPane sauf (il y a toujours une exception, n’est-ce pas 🙂

  • le composant invoqué par scrollRectToVisible a une implémentation personnalisée (en tant que composants de texte fi
  • si l’emplacement par défaut atteint par cette méthode ne vous convient pas

modifier

un extrait de code pour @MadProgrammer 🙂 – mais trop paresseux pour supprimer toute trace de SwingX, alors allons-y:

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

C’est faisable.

Vous aurez besoin d’une référence au JLabel dans l’en-tête et aux endroits où il JPanel dans votre vue ( JPanel ). Une fois que vous avez ce lien, vous pouvez avoir besoin de déterminer l’emplacement du JLabel dans le ‘JPanel’.

Vous pouvez utiliser la JViewport.scrollRectToVisible(Rectangle) pour JViewport.scrollRectToVisible(Rectangle) à cet emplacement.

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

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