JavaFX ScrollPane滚动条未显示是否包含节点组放大

时间:2016-10-25 09:42:07

标签: javafx

我有一组节点。添加的第一个节点是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来解决此问题。 如果您发现此问题重复,请添加评论。

1 个答案:

答案 0 :(得分:2)

ScrollPane使用the layoutBounds property来确定尺寸,而不是boundsInParentlayoutBounds不包含转换。 layoutBounds只是在应用变换之前由Node几何确定的大小。因此,ScrollPane仍将大小视为未转换 content的大小。

要解决此问题,您可以将转化应用于Group的子项(Group在确定子项自身大小时将其转换为

// group.getTransforms().add(scaleTransformation);
viewer.getTransforms().add(scaleTransformation);

或将content包装在另一个Group

sp.setContent(new Group(group));

如果要向Group添加多个节点,则应使用第二种方法。