ImageView.getLayoutY()错误的值?

时间:2017-05-09 21:53:43

标签: java javafx

我有一点问题,希望你能帮助我:

Screenshot from my program

在这个场景中,那个蓝色圆圈是128x128 ImageView,这个ImageView在HBox中,而HBox在VBox中,然后我将VBox对齐设置为Pos.CENTER;

一切都还可以,但是当我打印ImageView的layoutY时,它会显示0而不是61(场景的高度为250,所以layoutY应该是125 - 64);

有人有想法吗? 感谢。

1 个答案:

答案 0 :(得分:3)

layoutXlayoutY属性确定其父节点内的节点布局位置:在本例中,HBox中图像的布局位置。由于HBox中没有其他内容,因此图片视图将位于(0,0)坐标系中的HBox,因此您只需获取0 layoutY {1}}属性。

(另请注意,转换,例如翻译,独立于布局坐标应用 - 如果您想以这种方式考虑,节点布局,则应用转换将改变其最终位置。所以转换请勿修改layoutXlayoutY属性。)

要获取场景中节点的位置,可以使用localToScene变换将节点自身​​坐标系中的点转换为场景坐标系中的点。因此,要获取场景中图像视图左上角((0,0))的位置,您可以

image.localToScene(new Point2D(0, 0))

这是一个完整的SSCCE(仅使用普通Region代表图像视图):

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class BoundsInSceneExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        HBox hbox = new HBox();
        Node image = createImage();
        hbox.getChildren().add(image);
        VBox root = new VBox();
        root.setAlignment(Pos.CENTER);
        root.getChildren().add(hbox);

        Scene scene = new Scene(root, 250, 250);

        // force the layout, so layout computations are performed:
        root.layout();

        System.out.printf("Layout coordinates: [%.1f, %.1f]%n", image.getLayoutX(), image.getLayoutY());
        Point2D sceneCoords = image.localToScene(new Point2D(0,0));
        System.out.printf("Scene coordinates: [%.1f, %.1f]%n", sceneCoords.getX(), sceneCoords.getY());

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

    private Node createImage() {
        Region region = new Region();
        region.setMinSize(128, 128);
        region.setPrefSize(128, 128);
        region.setMaxSize(128, 128);
        region.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
        return region ;
    }

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

enter image description here

输出:

Layout coordinates: [0.0, 0.0]
Scene coordinates: [0.0, 61.0]