JavaFX:如何在滚动窗格中水平居中放置图像视图?
我在滚动窗格中设置了一个带有一些图像的ImageView,但是ImageView总是位于最左的角落。在这里,我试图手动抵消差异,但效果不好。ImageView过右,而且只更新一次,因为它位于按钮的eventhandler中 下面是一个使用标签而不需要侦听器的示例:JavaFX:如何在滚动窗格中水平居中放置图像视图?,javafx,imageview,scrollpane,Javafx,Imageview,Scrollpane,我在滚动窗格中设置了一个带有一些图像的ImageView,但是ImageView总是位于最左的角落。在这里,我试图手动抵消差异,但效果不好。ImageView过右,而且只更新一次,因为它位于按钮的eventhandler中 下面是一个使用标签而不需要侦听器的示例: viewScroll.setContent(new ImageView(bigimg)); double w = viewScroll.getContent().getBoundsInLocal().getWidth(); doubl
viewScroll.setContent(new ImageView(bigimg));
double w = viewScroll.getContent().getBoundsInLocal().getWidth();
double vw = viewScroll.getViewportBounds().getWidth();
viewScroll.getContent().setTranslateX((vw/2)-(w/2));
viewScroll.toFront();
我不确定您是否熟悉属性,但在上面的代码中,当我将
translateProperty
绑定到公式时,每当一个依赖项更改时,例如滚动窗格的宽度属性
或标签的宽度属性
,重新计算公式,并将translateProperty
设置为公式的结果
我不确定,但在您以前的代码中,计算代码似乎位于resize侦听器中。在处理属性时,这不是必需的,因为当依赖项发生更改时属性会更新(请注意bind()
而不是set()
)。如果属性小于滚动窗格,为什么要将其放在滚动窗格中?加载的图像可能大小不同,一旦我弄明白了这一点,我打算实现缩放和平移。试图通过viewScroll.getContent().getBoundsInLocal().getWidth()获取宽度时,由于某种原因返回0,这可能就是它走得如此之右的原因。啊,就是这样!我还发现使用BufferImage并通过SwingFXUtils转换为Image可以为ImageView提供适当的宽度。如果您不介意的话,可以解释一下为什么translateProperty()不会一直向右递增吗?我想我是在问,LayoutX和TranslateProperty之间的关系是什么?据我所知,将TranslateX设置为不同的值根本不会影响LayoutX,它只是在每次更改TranslateProperty的值时应用新的translate?TranslateProperty
是对layoutXProperty
的偏移。布局设置layoutXProperty
,其他东西可以设置translateXProperty
。我明白了,谢谢。你知道哪个属性决定了可滚动区域吗?如中所示,在其中滚动/平移内容的区域。我遇到一个问题,内容被推到可滚动区域之外并被切断。
public void start(Stage primaryStage) throws Exception {
ScrollPane scrollPane = new ScrollPane();
Label label = new Label("Hello!");
label.translateXProperty().bind(scrollPane.widthProperty().subtract(label.widthProperty()).divide(2));
scrollPane.setContent(label);
Scene scene = new Scene(scrollPane);
primaryStage.setScene(scene);
primaryStage.setWidth(200);
primaryStage.setHeight(200);
primaryStage.show();
}