繁体   English   中英

layoutChildren被无限调用-JavaFX 2

[英]layoutChildren being called infinitely - JavaFX 2

将标签添加到添加到另一个窗格的窗格中时出现布局问题。

像这个例子:

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。 一件奇怪的事情是,如果我添加文本而不是标签,则“问题”不会发生。

我检查了每个节点的大小,它们没有变化。 在我看来,有人在扩展,并且为此布局进行了调用,但我只是找不到位置。

我缺少一些琐碎的东西吗?

QuantumToolkit不断调用layoutChildren。 遍历整个场景图,并且在应用程序的生存期内,每个节点都调用了此方法。 它永远不会结束。

从Oracle:

主题

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

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

脉冲

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

发射脉冲时,场景图上元素的状态向下同步到渲染层。 脉冲使应用程序开发人员可以异步处理事件。 这一重要功能使系统可以批量处理和执行脉冲事件。

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

Glass Windowing Toolkit负责执行脉冲事件。 它使用高分辨率的本地计时器进行执行。


在以某种方式更改的所有节点上,Layout Children每秒被调用60次。 因此,如果更改了图形深处的子代,则该子代的所有父代都会调用layoutChildren。

覆盖的布局方法将调用foo,这又将导致添加新的Label。 除非我弄错了,否则这将导致启动另一个布局遍历,这又将添加一个新的Label,从而导致您的无限循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM