给定一个带有一些子节点的巨大的AnchorPane
是ScrollPane
的内容,我如何滚动以使当前视口之外的子节点之一可见?
为了获得一个完美的快照,您需要考虑滚动条的开始和停止位置。视口从0开始的半视口(边界scollpane)开始,从最大边界停止半视口。边界与视口图片
so:半视口下的节点Y-
在这两者之间,我们需要计算总高度-1视口(一半开始,一半结束)和节点y-一半视口。然后(节点y-半视口)/(总高度-1视口)
double heightViewPort = scrollPane.getViewportBounds().getHeight();
double heightScrollPane = scrollPane.getContent().getBoundsInLocal().getHeight();
double y = Label.getBoundsInParent().getMaxY();
if (y<(heightViewPort/2)){
scrollPane.setVvalue(0);
// below 0 of scrollpane
}else if ((y>=(heightViewPort/2))&(y<=(heightScrollPane-heightViewPort/2))){
// between 0 and 1 of scrollpane
scrollPane.setVvalue((y-(heightViewPort/2))/(heightScrollPane-heightViewPort));
}
else if(y>= (heightScrollPane-(heightViewPort/2))){
// above 1 of scrollpane
scrollPane.setVvalue(1);
}
我为这个案例创建了一个稍微优雅一点的版本。但是,我只能在y轴上进行测试。希望能有帮助
private static void ensureVisible(ScrollPane scrollPane, Node node) {
Bounds viewport = scrollPane.getViewportBounds();
double contentHeight = scrollPane.getContent().localToScene(scrollPane.getContent().getBoundsInLocal()).getHeight();
double nodeMinY = node.localToScene(node.getBoundsInLocal()).getMinY();
double nodeMaxY = node.localToScene(node.getBoundsInLocal()).getMaxY();
double vValueDelta = 0;
double vValueCurrent = scrollPane.getVvalue();
if (nodeMaxY < 0) {
// currently located above (remember, top left is (0,0))
vValueDelta = (nodeMinY - viewport.getHeight()) / contentHeight;
} else if (nodeMinY > viewport.getHeight()) {
// currently located below
vValueDelta = (nodeMinY + viewport.getHeight()) / contentHeight;
}
scrollPane.setVvalue(vValueCurrent + vValueDelta);
}
编辑:下一个示例中的代码比我的更精确:https://stackoverflow.com/a/23518314/1054140
您需要在content
中找到此内部节点的坐标,并相应地调整滚动窗格的
vValue
和hValue
。
请参阅下一个小应用程序中的
ensurevicible()
方法:
public class ScrollPaneEnsureVisible extends Application {
private static final Random random = new Random();
private static void ensureVisible(ScrollPane pane, Node node) {
double width = pane.getContent().getBoundsInLocal().getWidth();
double height = pane.getContent().getBoundsInLocal().getHeight();
double x = node.getBoundsInParent().getMaxX();
double y = node.getBoundsInParent().getMaxY();
// scrolling values range from 0 to 1
pane.setVvalue(y/height);
pane.setHvalue(x/width);
// just for usability
node.requestFocus();
}
@Override
public void start(Stage primaryStage) {
final ScrollPane root = new ScrollPane();
final Pane content = new Pane();
root.setContent(content);
// put 10 buttons at random places with same handler
final EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
int index = random.nextInt(10);
System.out.println("Moving to button " + index);
ensureVisible(root, content.getChildren().get(index));
}
};
for (int i = 0; i < 10; i++) {
Button btn = new Button("next " + i);
btn.setOnAction(handler);
content.getChildren().add(btn);
btn.relocate(2000 * random.nextDouble(), 2000 * random.nextDouble());
}
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
// run once to don't search for a first button manually
handler.handle(null);
}
public static void main(String[] args) { launch(); }
}
我正在尝试获取一些关于组件的信息,这些组件按标准包含在中。特别是我对阅读水平的感兴趣。我怎么参考?
法比安 示例图像
我试图将乘法VBox添加到scrollpane中的gridpane(在下面的codesnippet中称为refPane)。 它在一行中添加不超过ITEMS_PER_ROW的Vbox,并在下一行中继续。也不应该有更多的行,然后ITEMS_PER_COLUM可见。问题是,如果我添加更多的ITEMS_PER_ROW*ITEMS_PER_COLUMN到网格中,而不是obingbeingscrollable
我希望能够向下滚动动态生成的电影列表。我尝试添加滚动窗格。 我在页面的开头有一个导航栏,中间有一个包含所有电影的jpanel。 您可以使用以下代码重新创建此示例: 我想做的是用我的鼠标滚轮向下滚动这个电影列表,而不看任何滚动条。它现在看起来应该和现在一模一样,但我希望能够向下滚动,看到所有的电影。 我不知道为什么它不起作用,这就是为什么我在这里问,希望有人能向我解释我做错了什么。
问题我如何可以嵌入这个应用程序到SPlitPane,在左边将是另一个面板。 不幸的是,代码导致了错误的坐标,
问题内容: 我已经创建了JTextpane并在textpane中插入了组件(像Jtextarea这样的组件)。当我在该JTextpane中插入新组件时,JTextpane的Jscrollpane(的垂直滚动条)会自动设置为底部。我想将其设置为最高位置。我怎样才能做到这一点 感谢Sunil Kumar Sahoo 问题答案: 这是我使用的实用程序类。可用于滚动到的顶部,底部,左侧,右侧或水平/垂直中