我有一组节点。添加的第一个节点是ImageView
。
然后,将该组设置为可滚动窗格的内容子节点。
该组必须进行规模转换才能调整该组的大小。
如果向可滚动窗格添加了事件过滤器,以便识别是否使用了CTRL和鼠标滚轮。这应该创建我需要的放大和缩小操作。
问题是可滚动窗格不会根据放大或缩小组更改条形。
以下是代码段
Group group = new Group();
ScrollPane sp = new ScrollPane();
sp.setHbarPolicy(ScrollBarPolicy.ALWAYS);
sp.setVbarPolicy(ScrollBarPolicy.ALWAYS);
sp.setContent(group);
InputStream is = MaApplication.class.getResourceAsStream("test.jpg");
Image img = new Image(is);
ImageView viewer = new ImageView(img);
viewer.setFitWidth(600);
viewer.setPreserveRatio(true);
viewer.setDisable(true);
viewer.setCache(true);
group.getChildren().add(viewer);
DoubleProperty zoomProperty = new SimpleDoubleProperty(1);
Scale scaleTransformation = new Scale();
scaleTransformation.xProperty().bind(zoomProperty);
scaleTransformation.yProperty().bind(zoomProperty);
group.getTransforms().add(scaleTransformation);
sp.addEventFilter(ScrollEvent.SCROLL, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
if (event.isControlDown() && event.getDeltaY() > 0) {
zoomProperty.set(zoomProperty.get() * 1.1);
} else if (event.isControlDown() && event.getDeltaY() < 0) {
zoomProperty.set(zoomProperty.get() / 1.1);
}
}
});
我不想使用StackPane
实例,因为它在不同的示例中使用。应该使用Group
来解决此问题。
如果您发现此问题重复,请添加评论。
答案 0 :(得分:2)
ScrollPane
使用the layoutBounds
property来确定尺寸,而不是boundsInParent
。 layoutBounds
不包含转换。 layoutBounds
只是在应用变换之前由Node
几何确定的大小。因此,ScrollPane
仍将大小视为未转换 content
的大小。
要解决此问题,您可以将转化应用于Group
的子项(Group
在确定子项自身大小时将其转换为
// group.getTransforms().add(scaleTransformation);
viewer.getTransforms().add(scaleTransformation);
或将content
包装在另一个Group
sp.setContent(new Group(group));
如果要向Group
添加多个节点,则应使用第二种方法。