由于某些节点直到布局周期后才具有正确的边界,因此我必须在Platform.runLater调用中进行一些相对定位。也许我需要将这些操作转换为使用绑定,但这不是问题。这个问题是关于JavaFX Application线程如何平衡布局任务和用runLater提交的任务。

嵌套:

Platform.runLater( () -> {
  nodeA.setLayoutX( offset + nodeB.getLayoutBounds().getWidth() );
  Platform.runLater( op2 );
});


顺序:

Platform.runLater( () -> {
  nodeA.setLayoutX( offset + nodeB.getLayoutBounds().getWidth() );
});
Platform.runLater( op2 );


我希望setLayoutX在内部调用setNeedsLayout。在这两个版本中,op2显然都在调用nodeA.setLayoutX之后运行。区别在于,在嵌套版本中,op2在调用setLayoutX之后注册,而在顺序版本中,op2在调用setLayoutX之前注册。

对于这两个版本,只有在第一个操作完成后才能进行布局。问题是:对于这两个版本,是否都可以确定op2是在JavaFX GUI线程处理nodeA的修改之前还是之后运行?此行为可能是特定于平台的吗?

减少通用性:假设JavaFX Application线程对SceneNodeA进行布局时,布局管理器会修改边界。当op2读取这些边界时,op2是否会在A)仅嵌套的案例或B)两种情况或C)(不一定是两种情况)中看到布局操作的副作用?

最佳答案

Platform.runLater,只要Application线程尚未运行,您就可以看到队列。这意味着,每次对Platform.runLater的调用都会将Runnable放入队列中,该队列以该顺序执行。

对于您的示例,这没有什么区别,因为op2总是在nodeA.setLayoutX( offset + nodeB.getLayoutBounds().getWidth() );之后在ApplicationThread中执行

潜在的差异可能是在嵌套情况下,在setLayoutXop2之间的队列中还有其他操作,因为op2仅在setLayoutX操作运行后才添加。

10-07 13:42