Как прокрутить к определенному местоположению в JScrollPane


У меня есть JScrollPane, который содержит JPanel, который имеет большую высоту, эта большая JPanel содержит больше Jpanels в нем, как на изображении. Некоторые из этих панелей содержат JLabel, который я использовал для отображения заголовков. В верхней части есть JLabels, которые имеют номера, соответствующие номерам заголовка в заголовках. Что мне нужно сделать, так это когда я нажимаю на метку из верхнего списка меток, JScrollBar должен прокручиваться до позиции, где эта метка размещена.

Я не знаю, возможно ли это или нет. нет, но если кто-то знает, как прокрутить до определенной позиции в JScrollPane, пожалуйста, помогите мне.

Введите описание изображения здесь

3 7

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

ScrollRectToVisible не работает для меня. Но, я решил таким образом:

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