1

我在单击时将矩形放在 vbox 上,然后打印矩形的坐标。在按下键时,我只打印坐标。看看这个示例代码示例:

@FXML
private VBox vbox;

@FXML
private AnchorPane anchorpane;

private List<Rectangle> rectangles = new ArrayList<>();

@Override
public void initialize(URL location, ResourceBundle resources) {
    System.out.println("init");

}

@FXML
private void onMouseClick(MouseEvent e) {
    System.out.println("click");
    vbox.getChildren().clear();

    for(int i = 0; i < 3 ; i++){
        Rectangle r = new Rectangle(100.0, 10.0, Color.BLACK);
        r.addEventHandler(KeyEvent.ANY, this::onKeyTyped);
        rectangles.add(r);
        vbox.getChildren().add(r);

        System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY());
        System.out.println("Vbox height : " + vbox.getBoundsInLocal().getHeight());

    }

}

@FXML
private void onKeyTyped(KeyEvent e) {
    System.out.println("Key pressed");
    for (Rectangle r : rectangles){         
        System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY());
        }
    System.out.println("Vbox height : " + vbox.getBoundsInLocal().getHeight());
}

这给了我以下输出:

click
r Yposition :0.0 or 0.0 or 0.0
Vbox height : 10.0
r Yposition :0.0 or 0.0 or 0.0
Vbox height : 10.0
 r Yposition :0.0 or 0.0 or 0.0
Vbox height : 10.0

Key pressed
 r Yposition :0.0 or 0.0 or 0.0
 r Yposition :10.0 or 10.0 or 0.0
 r Yposition :20.0 or 20.0 or 0.0
Vbox height : 30.0

所以我想JavaFX在屏幕上打印它时会分配形状的坐标。但是当我刷新它时,我怎样才能在 Vbox 中获得形状的坐标呢?

4

1 回答 1

3

将矩形添加到 后VBox,如果立即调用,则getBoundsInParent()不会得到任何结果。

可以在这里找到原因:

布局和 CSS 也与脉冲事件相关联。场景图中的大量更改可能会导致多个布局或 CSS 更新,这可能会严重降低性能。系统在每个脉冲自动执行一次 CSS 和布局传递,以避免性能下降。应用程序开发人员还可以根据需要手动触发布局通道,以便在脉冲之前进行测量。

因此,如果您真的需要在同一次传递中这些矩形的边界,您可以调用:

vbox.layout();

在将每个矩形添加到框以获取其最终位置之后。

根据Javadoc layout(),:

在此父项下的场景图上执行自上而下的布局传递。在 Parent 进行布局时调用此方法是无操作的

现在这将按您的预期工作:

for(int i = 0; i < 3 ; i++){
    Rectangle r = new Rectangle(100.0, 10.0, Color.BLACK);
    rectangles.add(r);
    vbox.getChildren().add(r);
    vbox.layout();

    System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY());
    System.out.println("Vbox height : " + vbox.getBoundsInLocal().getHeight());
}

或者,您可以覆盖 的layoutChildren()方法vbox,因为它在布局传递期间调用以在此父级中布局子级:

private VBox vbox=new VBox(){

    @Override
    protected void layoutChildren() {
        super.layoutChildren(); 
        for (Rectangle r : rectangles){         
            System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY());
        }
    }

};

它会给你同样的结果。请注意,这不适用于vbox添加到 FXML 文件,因为您需要创建它的新实例。

于 2015-05-02T11:15:30.463 回答