gpt4 book ai didi

java - layoutChildren 被无限调用 - JavaFX 2

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:55 25 4
gpt4 key购买 nike

将标签添加到已添加到另一个 Pane 的 Pane 时,我遇到布局问题。

就像这个例子:

public class MyClass extends Pane {

private final Pane myPane;

public MyClass() {

this.myPane.prefWidthProperty().bind(this.widthProperty);
this.myPane.prefHeightProperty().bind(this.heightProperty);

this.getChildren().add(this.myPane);
}

@Override
layoutChildren() {

this.foo();
}

private void foo() {

this.myPane.getChildren().add(new Label("foo"));
}

}

问题是它只是无限地调用layoutChildren。一件奇怪的事情是,如果我添加文本而不是标签,则不会出现“问题”。

我检查了每个节点的大小,它们没有改变。在我看来,有人正在扩展,并为此调用了布局,但我只是找不到在哪里。

我遗漏了一些微不足道的东西吗?

最佳答案

layoutChildren 不断被 QuantumToolkit 调用。遍历整个场景图,每个节点在应用程序的生命周期中都会调用此方法。它永远不会结束。

来自 Oracle:

话题

系统在任何给定时间运行两个或多个以下线程。

JavaFX应用程序线程:这是JavaFX应用程序开发人员使用的主线程。任何“实时”场景(即属于窗口一部分的场景)都必须从此线程访问。场景图可以在后台线程中创建和操作,但是当其根节点附加到场景中的任何 Activity 对象时,必须从 JavaFX 应用程序线程访问该场景图。这使得开发人员能够在后台线程上创建复杂的场景图,同时保持“实时”场景上的动画流畅且快速。 JavaFX 应用程序线程与 Swing 和 AWT 事件调度线程 (EDT) 是不同的线程,因此在将 JavaFX 代码嵌入到 Swing 应用程序中时必须小心。Prism 渲染线程:该线程独立于事件调度程序处理渲染。它允许在处理第 N+1 帧的同时渲染第 N 帧。这种执行并发处理的能力是一个很大的优势,特别是在具有多个处理器的现代系统上。 Prism 渲染线程还可能具有多个光栅化线程,以帮助卸载渲染​​中需要完成的工作。媒体线程:该线程在后台运行,并使用 JavaFX 应用程序线程通过场景图同步最新帧。

脉搏

脉冲是一个事件,它向 JavaFX 场景图指示是时候将场景图上的元素状态与 Prism 同步了。脉冲被限制在最大 60 帧每秒 (fps),并且每当动画在场景图上运行时就会触发。即使动画未运行,当场景图中的某些内容发生更改时,也会安排脉冲。例如,如果按钮的位置发生变化,则会调度脉冲。

当脉冲被触发时,场景图上元素的状态会同步到渲染层。脉冲为应用程序开发人员提供了一种异步处理事件的方法。这一重要功能允许系统按脉冲批处理和执行事件。

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

Glass Windowing Toolkit 负责执行脉冲事件。它使用高分辨率的 native 定时器来执行。

<小时/>

在以某种方式更改的所有节点上每秒调用 Layout Children 60 次。因此,如果图表深处的子级发生更改,则该子级的所有父级都将调用layoutChildren。

关于java - layoutChildren 被无限调用 - JavaFX 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com