java - 嵌套 Platform.runLater 调用与顺序调用 : When is it safe to read side effects of layout that happened on the JavaFX Application thread?

标签 java user-interface javafx

由于某些节点在布局周期之后才具有正确的边界,因此我必须在 Platform.runLater 调用中进行一些相对定位。也许我需要将这些操作转换为使用绑定(bind),但这不是问题。这个问题是关于JavaFX应用程序线程如何平衡布局任务和通过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 应用程序线程对场景节点 A 进行布局时,布局管理器会修改边界。当 op2 读取这些边界时,op2 是否会看到布局操作的副作用:A) 仅嵌套情况或 B) 两种情况或 C) 不一定是两种情况?

最佳答案

Platform.runLater 你可以看到像一个队列,只要Application线程还没有运行。这意味着,每次调用 Platform.runLater 都会将 Runnable 放入队列中,并按该顺序执行。

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

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

关于java - 嵌套 Platform.runLater 调用与顺序调用 : When is it safe to read side effects of layout that happened on the JavaFX Application thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34444325/

相关文章:

html - 用户界面 : Multiple choice select boxes

r - R 控制台中的彩色输出,尤其是。有色错误

python - PyQt:不均等地划分QHBoxLayout中小部件占用的区域

JavaFX TreeView ChangeListener 旧值始终为 null

java - 如何使用 JDBC 从数据库中检索 SDO_GEOMETRY?

Java - 沿二叉树评估节点值

java - ServletFileUpload.parseRequest() 为 MockMultipartHttpServletRequest 返回一个空列表

memory-leaks - 具有动态 TableColumns 的 TableView 中的 JavaFX 内存泄漏

java - Java 8 Eclipse 未设置 Root 错误

java - twitter4j.TwitterException : 401:Authentication credentials were missing or incorrect