Как прокрутить к определенному местоположению в JScrollPane
У меня есть JScrollPane, который содержит JPanel, который имеет большую высоту, эта большая JPanel содержит больше Jpanels в нем, как на изображении. Некоторые из этих панелей содержат JLabel, который я использовал для отображения заголовков. В верхней части есть JLabels, которые имеют номера, соответствующие номерам заголовка в заголовках. Что мне нужно сделать, так это когда я нажимаю на метку из верхнего списка меток, JScrollBar должен прокручиваться до позиции, где эта метка размещена.
Я не знаю, возможно ли это или нет. нет, но если кто-то знает, как прокрутить до определенной позиции в JScrollPane, пожалуйста, помогите мне.
3 ответа:
Предполагая, что вы хотите, чтобы вся панель, содержащая метку в качестве заголовка, была видна:
Container parent = titleLabel.getParent(); parent.scrollRectToVisible(parent.getBounds());
Нет необходимости обращаться к содержащему viewport / scrollPane except (всегда есть исключение, не так ли: -)
- компонент, на который вызывается scrollRectToVisible, имеет пользовательскую реализацию (например, текстовые компоненты
- если местоположение по умолчанию, достигнутое этим методом, не соответствует вашим требованиям
Edit
Фрагмент кода для @MadProgrammer :- )- но слишком ленив, чтобы удалить все следы SwingX, так что мы идем:
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);
Это выполнимо.
Вам понадобится ссылка на
JLabel
в заголовке и там, где он ссылается на ваше представление (JPanel
). После того, как у вас есть эта ссылка, Вам может понадобиться определить местоположениеJLabel
в "JPanel".Вы можете использовать метод
JViewport.scrollRectToVisible(Rectangle)
для прокрутки до этого места.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);