生成节点的预设位置

Pre-set position of spawned node

我正在尝试制作在相当大的窗格(它是滚动窗格的子项)上生成新的可拖动节点的应用程序,但该节点应该在屏幕中央生成。

问:有什么方法可以预先设置这些新的imageviews的X,Y坐标吗?

例如:

 button.setOnAction(new EventHandler<ActionEvent>() {
    @Override public void handle(ActionEvent e) {
    Bounds bounds = scrollPane.getBoundsInLocal();
    Bounds screenBounds = scrollPane.localToScreen(bounds);

    int mX = (int) screenBounds.getMinX();
    int mY = (int) screenBounds.getMinY();

    Rectangle2D primScreenBounds = Screen.getPrimary().getVisualBounds();
    int x = (int) ((primScreenBounds.getWidth() - mX) /4);
    int y = (int) ((primScreenBounds.getHeight() - mY) /4);   

    /*
    System.out.println("X coords:" +x);
    System.out.println("Y coords:" +y);
    */

    pane.getChildren().addAll(new ImageView(imgvw.getImage()));
    //somehow set coordinates of new ImageView

    }
 });    

这可能取决于放置 ImageView 的父级,但通常您应该能够将 NodeRegion#positionInArea() 一起放置(RegionParent 的超类)。请注意,这是一个受保护的方法,这意味着您可能想要创建自己的父级(例如,通过扩展 StackPane)。

也就是说,有很多 Parent Node,每个都提供自己独特的行为。在创建您自己的实现之前,请尝试确保使用其中任何一个都无法实现所需的行为。 (而且由于您没有指定任何定位行为,因此很难提出建议)

您设置位置的方式取决于您使用的布局。但是假设你使用 Pane,你可以使用

  • layoutXlayoutY
  • translateXtranslateY
ImageView iv = new ImageView(imgvw.getImage());
iv.setLayoutX(x);
iv.setLayoutY(y);
pane.getChildren().add(iv);

其他布局,例如StackPane 自动设置 layoutXlayoutY。在这种情况下,您可以将 managed 设置为 false

iv.setManaged(false);

或为布局类型使用适当的参数。