我正在开展一个项目,我想用叠加显示图像。
我的想法是创建一个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();
}
}
运行该示例时,您可以看到当您将窗口大小扩展到图像大小的两倍时,滚动条只会消失。我知道我可以禁用滚动条。这可能在示例代码中有效,但请记住,此示例在很大程度上缩短了。我甚至削减了动态调整大小。
答案 0 :(得分:1)
如果有人发现这个问题,我会用ScrollPane documentation的引用来回答我自己的问题。
ScrollPane布局计算基于layoutBounds而不是boundsInParent 滚动节点的(可视边界)。如果应用程序希望滚动基于节点的可视边界(对于缩放内容等),则需要将滚动节点包装在一个组中。
答案 1 :(得分: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);