【问题标题】:When does Vbox/Hbox assign coordinate for it's children?Vbox/Hbox 什么时候为它的孩子分配坐标?
【发布时间】:2015-05-02 09:49:35
【问题描述】:

我在单击时将矩形放在 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中获得形状的坐标?

【问题讨论】:

    标签: java javafx java-8 javafx-8 vbox


    【解决方案1】:

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

    可以找到原因here

    布局和 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());
    }
    

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

    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());
            }
        }
    
    };
    

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

    【讨论】:

    • 谢谢你,这正是我要找的,但我找不到。抱歉回复晚了
    猜你喜欢
    • 2016-04-17
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多