热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vbox和Hbox在什么情况下为其子元素分配坐标?-在哪些场景下Vbox和Hbox会为其子组件分配坐标值?

在Vbox和Hbox布局中,当用户点击容器添加一个矩形时,系统会自动为该矩形分配坐标并打印其位置信息。此外,在按键事件触发时,系统仅打印当前矩形的坐标值。这两种布局在特定的交互场景下,能够动态地管理和更新子组件的位置。

I put rectangle on a vbox on click and I print coordinate of the rectangle. On key pressed I only print the coordinate. Look at this sample code example :

我点击vbox上的矩形,我打印矩形的坐标。按下键时我只打印坐标。看看这个示例代码示例:

@FXML
private VBox vbox;

@FXML
private AnchorPane anchorpane;

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

This give me the following output :

这给了我以下输出:

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

So I suppose JavaFX assign coordinate of the shape when it prints it on the screen. But how can I have the coordinate of the shape in the Vbox when I refresh it ?

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

1 个解决方案

#1


After you add the rectangles to the VBox, if you call inmediately to getBoundsInParent() you get no results.

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

The reason for this can be found here:

原因可以在这里找到:

Layout and CSS are also tied to pulse events. Numerous changes in the scene graph could lead to multiple layout or CSS updates, which could seriously degrade performance. The system automatically performs a CSS and layout pass once per pulse to avoid performance degradation. Application developers can also manually trigger layout passes as needed to take measurements prior to a pulse.

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

So if you really need the bounds of those rectangles in the same pass, you can call:

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

vbox.layout();

right after adding each rectangle to the box to get its final position.

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

According to Javadoc, layout():

根据Javadoc,layout():

Executes a top-down layout pass on the scene graph under this parent. Calling this method while the Parent is doing layout is a no-op

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

And now this will work as you would expected:

现在,这将按照您的预期运作:

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

Alternatively, you could override the layoutChildren() method of vbox, as it is invoked during the layout pass to layout the children in this parent:

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

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

};

It will give you the same result. Note that this won't work with vbox added to the FXML file, since you need to create a new instance of it.

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


推荐阅读
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 本文探讨了在UIScrollView上嵌入Webview时遇到的一个常见问题:点击图片放大并返回后,Webview无法立即滑动。我们将分析问题原因,并提供有效的解决方案。 ... [详细]
  • 本文详细介绍了在单片机编程中常用的几个C库函数,包括printf、memset、memcpy、strcpy和atoi,并提供了具体的使用示例和注意事项。 ... [详细]
  • MyBatisCodeHelperPro 2.9.3 最新在线免费激活方法
    MyBatisCodeHelperPro 2.9.3 是一款强大的代码生成工具,适用于多种开发环境。本文将介绍如何在线免费激活该工具,帮助开发者提高工作效率。 ... [详细]
  • Lua IO操作详解
    本文介绍了Lua中的IO操作,包括简单模式和完整模式下的文件处理方法,以及相关的系统调用。 ... [详细]
author-avatar
广东暖暖_小乖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有