猿问

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

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();

    }



30秒到达战场
浏览 142回答 2
2回答

MMMHUHU

在 JavaFX 应用程序线程通过 handle() 将任何其他事件提交给 X 之前,步骤 2 中的处理是否有望完成?是的。因此 JavaFX 线程按顺序执行所有操作。例如,如果您要Thread.sleep在handle()方法中添加 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 上。当您将鼠标移到这个节点上时,它会以帧速率闪烁——而不是在更新屏幕之前进入无限循环。
随时随地看视频慕课网APP

相关分类

Java
我要回答