1

将标签添加到添加到另一个窗格的窗格时,我遇到了布局问题。

就像在这个例子中一样:

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

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

我错过了什么微不足道的东西吗?

4

2 回答 2

1

QuantumToolkit 不断调用 layoutChildren。遍历整个场景图,并且每个节点都在应用程序的生命周期内调用此方法。永无止境。

来自甲骨文:

线程

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

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。

于 2017-10-14T19:55:51.540 回答
0

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

于 2014-09-25T03:41:51.090 回答