我正在一个项目中,我想用重叠显示图像。

我的想法是创建一个AncorPane,在其背景中放置一个ImageView,然后在其上方放置几个形状。这确实有效。

由于图像很大,因此需要根据可用空间按比例缩小图像。不用说要缩小相对于图像位于同一位置的所有叠加形状。在视觉上,通过将缩放转换应用于AncorPane也可以实现此功能,但这是我的问题。

AncorPane的尺寸来自其子级。但是,即使将它们按比例缩小,AncorPane仍保持未转换图像的大小。这将创建大量空白。
我认为这是布局范围与不可调整大小的节点的父级范围之间存在差异的问题。

有没有人建议设置AncorPane矿石的实际大小,或者用另一种方法摆脱这种不需要的空白。

例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;


public class test extends Application
{
    @Override
    public void start(final Stage stage) throws Exception
    {
        final ScrollPane scroll = new ScrollPane();
        final Scene scene = SceneBuilder.create().root(scroll).build();
        final VBox box = new VBox();

        final AnchorPane anchorPane = new AnchorPane();
        final ImageView imageView = new ImageView();
        final Shape overlayRectangle = new Rectangle(100, 100, 100, 100);

        scroll.setContent(box);
        box.getChildren().add(anchorPane);
        anchorPane.getChildren().addAll(imageView, overlayRectangle);
        overlayRectangle.toFront();

        imageView.setImage(new Image("http://cdn.sstatic.net/stackoverflow/img/sprites.png"));

        final Scale scale = new Scale(0.5, 0.5);
        anchorPane.getTransforms().add(scale);

        stage.setScene(scene);
        stage.show();
    }

    public static void main(final String[] args)
    {
        launch();
    }
}


运行该示例时,您可以看到,只有将窗口大小扩展到图像大小的两倍时,滚动条才会消失。我知道我可以禁用滚动条。这可能在示例代码中可行,但请记住,此示例在很大程度上已缩短。我什至删除了动态调整大小。

最佳答案

我将用ScrollPane documentation的引号回答我自己的问题,以防有人发现。


  ScrollPane布局计算基于layoutBounds而不是boundsInParent
  (可视边界)。如果应用程序希望滚动基于节点的可视范围(用于缩放的内容等),则它们需要将滚动节点包装在Group中。

10-06 06:51