layoutChildren被无限调用 - JavaFX 2

时间:2014-09-24 20:50:30

标签: java javafx-2 label 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。有一件事很奇怪,如果我添加一个Text而不是Label,那么"问题"不会出现。

我检查了每个节点的大小并且它们没有变化。我觉得有人在扩展,为此布局被调用,但我无法找到位置。

我有什么微不足道的东西吗?

2 个答案:

答案 0 :(得分:1)

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负责执行脉冲事件。它使用高分辨率本机定时器来执行。

布局子项在所有已经以某种方式更改的节点上被调用60次/秒。因此,如果图表深处的孩子发生了变化,那个孩子的所有父母都会调用layoutChildren。

答案 1 :(得分:0)

您的覆盖布局方法会调用foo,这会导致添加新的Label。除非我弄错了,这将导致另一个布局传递被启动,这反过来将添加一个新的Label,从而导致你的无限循环。