我有一个 JScrollPane,其中包含一个高度较大的 JPanel,这个大 JPanel 中包含更多的 Jpanel,如图像中所示。其中一些面板包含我用来显示标题的 JLabel。在顶部,有 JLabels,其编号与标题标签中的标题编号匹配。我需要做的是,当我从顶部标签列表中单击一个标签时,JScrollBar 应该滚动到放置该标签的位置。
我不知道这是否可能,但如果有人知道如何滚动到 JScrollPane 中的特定位置,请帮助我。
我有一个 JScrollPane,其中包含一个高度较大的 JPanel,这个大 JPanel 中包含更多的 Jpanel,如图像中所示。其中一些面板包含我用来显示标题的 JLabel。在顶部,有 JLabels,其编号与标题标签中的标题编号匹配。我需要做的是,当我从顶部标签列表中单击一个标签时,JScrollBar 应该滚动到放置该标签的位置。
我不知道这是否可能,但如果有人知道如何滚动到 JScrollPane 中的特定位置,请帮助我。
假设您希望包含作为标题的标签的整个面板可见:
Container parent = titleLabel.getParent();
parent.scrollRectToVisible(parent.getBounds());
无需访问包含的视口/scrollPane 除了(总是有一个例外,不是吗:-)
编辑
@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());