为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFX 应用程序线程的预期行为是什么

JavaFX 应用程序线程的预期行为是什么

30秒到达战场 2021-09-03 15:12:00
EventHandler 实现 X 附加到 Pane 并侦听所有 MouseEvents。当然,X 有一个handle()从 JavaFX 应用程序线程接收 MouseEvents的方法。窗格包含一个矩形。当 Pane 在 Rectangle 上接收到 MouseEvent.MOUSE_CLICK 时,X 会做两件事:从窗格中移除矩形,然后立即添加另一个矩形(这可能会导致其他事件。继续进行一些随意的处理这是问题:步骤 2 中的处理是否有望在 JavaFX 应用程序线程通过任何进一步的事件提交给 X之前完成handle()?请注意,第 1 步可能会触发其他事件!只是寻找是或否的回应。你的答案背后的推理也很好!我应该补充一点,在任何地方都没有涉及任何其他线程,包括在“任意处理”中。编辑:示例代码package bareBonesJavaFXBugExample;import javafx.application.Application;import javafx.scene.Scene;import javafx.scene.control.Label;import javafx.scene.input.MouseEvent;import javafx.scene.layout.Pane;import javafx.stage.Stage;/** * An {@link Application} with one {@link Pane} containing one {@link Label}. * The {@link Label} has a single {@link javafx.event.EventHandler},  * {@link LabelEventHandler} which processes all {@link MouseEvent}s the {@link Label} * receives. *  * To trigger the bug, run the application, then spend a second mouse over the  * little label in the upper left hand corner of the screen. You will see output to  * standard I/O. Then, click the label, which will then disppear. Check the I/O for * Strings ending in debugCounter is 1.  *  * What that String means and how it proves that the JavaFX Application Thread has  * become reentrant is explained in the javadoc of {@link LabelEventHandler}. */public class JavaFXAnomalyBareBonesApplication extends Application{    public void start(Stage primaryStage)    {      Pane mainPane = new Pane();      mainPane.setMinHeight(800);      mainPane.setMinWidth(800);      Label label = new Label(" this is quite a bug !!!!");      LabelEventHandler labelEventHandler = new LabelEventHandler(mainPane, label);      label.addEventHandler(MouseEvent.ANY, labelEventHandler);      mainPane.getChildren().add(label);      Scene scene = new Scene(mainPane);      primaryStage.setScene(scene);      primaryStage.show();    }
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

在 JavaFX 应用程序线程通过 handle() 将任何其他事件提交给 X 之前,步骤 2 中的处理是否有望完成?

是的。因此 JavaFX 线程按顺序执行所有操作。例如,如果您要Thread.sleephandle()方法中添加 a ,则 JavaFX 线程在睡眠完成之前不会执行任何操作。它按顺序完成所有处理,我猜这是线程的定义元素。它不会关闭并并行处理其他事件。这在动画中非常重要,因为所有这些处理都必须在 JavaFX 线程计算和显示下一帧之前发生。

附录:

考虑到这一点 - 如果光标位于 Rectangle 上,则由于 MouseEvent 会发布一个 MouseEvent.MOUSE_EXIT 事件而导致的 Rectangle 删除,因为在 JavaFX 的眼中,这就是刚刚发生的事情。该 MouseEvent 是在 JavaFX 应用程序线程上生成的,并将由它处理。现在是要考虑的事情。JavaFX 应用程序线程可以跟随 MOUSE_EXIT 到 X 的 handle() 或继续 dcoig 任意处理。它做什么?

MOUSE_CLICKED 事件将首先被处理。在线程处理完所有触发的事件后,它会绘制到屏幕上。屏幕更新完成后,它将处理任何新的触发事件,例如 MOUSE_EXIT。例如,假设您创建了一个节点,该节点删除了 MOUSE_ENTERED 上的节点,然后将其放回 MOUSE_EXIT 上。当您将鼠标移到这个节点上时,它会以帧速率闪烁——而不是在更新屏幕之前进入无限循环。


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信