2

我正在做一个项目,我想在其中显示带有叠加层的图像。

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

由于图像非常大,因此需要根据可用空间按比例缩小。不用说想要缩小它们相对于图像保持在同一位置的所有叠加形状。从视觉上看,通过对 AncorPane 应用 Scale Transformation 也可以做到这一点,但我的问题来了。

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();
    }
}

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

4

2 回答 2

1

我将用ScrollPane 文档中的引用来回答我自己的问题,以防有人发现这一点。

ScrollPane 布局计算基于 layoutBounds 而不是滚动节点的 boundsInParent(视觉边界)。如果应用程序希望滚动基于节点的视觉边界(对于缩放的内容等),他们需要将滚动节点包装在一个组中。

于 2013-01-15T08:41:58.327 回答
0

问题是因为你的

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

删除比例尺,因为它已经是sizeToScene,但您正在重新定义它。它解决了你的问题吗?

还要改变scale()方法的参数以增加或减少(一种缩放效果)空白问题。

或删除,将其更改为:

 final Scale scale = new Scale(1,1);
 anchorPane.getTransforms().add(scale);
于 2013-01-10T11:23:27.403 回答