JavaFX-获取节点相对于其父节点的坐标
我正在制作一个简单的图形界面来保存以前生成的图像。所有的图像都是方形的,但我想允许一些裁剪功能(更精确地从图像的底部和顶部切掉相等的部分)。我想通过允许用户在图像上拖动一个阴影区域来实现这一点,这将告诉用户该区域将被裁剪。有关详细信息,请参见下图。为了启用此拖动功能,我添加了一些小三角形,希望用户拖动这些三角形,从而移动着色区域。然而,这些三角形的坐标都很奇怪,看起来很荒谬。因此,我想知道,根据ImageView边长获得三角形相对于ImageView(或其第一个公共父节点)的坐标的最佳方法是什么。所以如果三角形在中心,它的坐标是[0.5,0.5] 图像视图将在场景中四处移动,并且也将改变大小,因此我可以获得相对于ImageView以及ImageView大小的坐标是至关重要的 如果有帮助的话,这里还有节点的周围层次结构。多边形是三角形,区域是矩形JavaFX-获取节点相对于其父节点的坐标,javafx,coordinates,parent,Javafx,Coordinates,Parent,我正在制作一个简单的图形界面来保存以前生成的图像。所有的图像都是方形的,但我想允许一些裁剪功能(更精确地从图像的底部和顶部切掉相等的部分)。我想通过允许用户在图像上拖动一个阴影区域来实现这一点,这将告诉用户该区域将被裁剪。有关详细信息,请参见下图。为了启用此拖动功能,我添加了一些小三角形,希望用户拖动这些三角形,从而移动着色区域。然而,这些三角形的坐标都很奇怪,看起来很荒谬。因此,我想知道,根据ImageView边长获得三角形相对于ImageView(或其第一个公共父节点)的坐标的最佳方法是什么
谢谢你的帮助
节点。getBoundsInParent
返回节点在其父坐标中的边界。例如,polygon.getBoundsInParent()
将返回VBox
中的边界
如果需要“上一步”,可以使用parent.localToParent
执行此操作vBox.localToParent(boundsInVbox)
返回AnchorPane
坐标系中的边界
要获得相对于图像大小的值,只需除以图像大小即可
下面的示例仅允许您沿一个方向将覆盖区域移动到,并且不检查区域是否相交,但应足以演示该方法
有趣的部分是按钮的事件处理程序。它将第二个图像的视口限制为第一个图像中未覆盖的部分
private static void setSideAnchors(Node node) {
AnchorPane.setLeftAnchor(node, 0d);
AnchorPane.setRightAnchor(node, 0d);
}
@Override
public void start(Stage primaryStage) {
// create covering area
Region topRegion = new Region();
topRegion.setStyle("-fx-background-color: white;");
Polygon topArrow = new Polygon(0, 0, 20, 0, 10, 20);
topArrow.setFill(Color.WHITE);
VBox top = new VBox(topRegion, topArrow);
top.setAlignment(Pos.TOP_CENTER);
topArrow.setOnMouseClicked(evt -> {
topRegion.setPrefHeight(topRegion.getPrefHeight() + 10);
});
// create bottom covering area
Region bottomRegion = new Region();
bottomRegion.setStyle("-fx-background-color: white;");
Polygon bottomArrow = new Polygon(0, 20, 20, 20, 10, 0);
bottomArrow.setFill(Color.WHITE);
VBox bottom = new VBox(bottomArrow, bottomRegion);
bottom.setAlignment(Pos.BOTTOM_CENTER);
bottomArrow.setOnMouseClicked(evt -> {
bottomRegion.setPrefHeight(bottomRegion.getPrefHeight() + 10);
});
Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/402px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg");
ImageView imageView = new ImageView(image);
setSideAnchors(top);
setSideAnchors(bottom);
setSideAnchors(imageView);
AnchorPane.setTopAnchor(top, 0d);
AnchorPane.setBottomAnchor(bottom, 0d);
AnchorPane.setTopAnchor(imageView, 0d);
AnchorPane.setBottomAnchor(imageView, 0d);
AnchorPane container = new AnchorPane(imageView, top, bottom);
ImageView imageViewRestricted = new ImageView(image);
Button button = new Button("restrict");
button.setOnAction(evt -> {
// determine bouns of Regions in AnchorPane
Bounds topBounds = top.localToParent(topRegion.getBoundsInParent());
Bounds bottomBounds = bottom.localToParent(bottomRegion.getBoundsInParent());
// set viewport accordingly
imageViewRestricted.setViewport(new Rectangle2D(
0,
topBounds.getMaxY(),
image.getWidth(),
bottomBounds.getMinY() - topBounds.getMaxY()));
});
HBox root = new HBox(container, button, imageViewRestricted);
root.setFillHeight(false);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
你在找什么?@Slaw不知道那是什么。你能解释一下吗?根据场景坐标获取所有位置可能更容易。只需获得三角形的场景位置和
图像视图
,然后进行自己的计算。