JavaFX事件处理程序优先级

JavaFX事件处理程序优先级,java,javafx,Java,Javafx,我有一个带有“默认”事件处理程序的自定义组件(在本例中为KeyEvent.KEY_PRESS)。但是,我希望其他人也能够注册在这种情况下具有优先权的处理程序,以便他们能够“覆盖”默认行为 当前,处理程序顺序似乎基于处理程序的插入顺序,但是我的处理程序总是先注册,因为它是在创建新实例时注册的 如何控制java fx中事件处理程序的优先级,以允许其他人注册在我启动之前触发的处理程序?来自: 一个节点可以注册多个处理程序。每一个的顺序 根据事件类型的层次结构调用处理程序。处理者 对于特定的事件类型,在

我有一个带有“默认”事件处理程序的自定义组件(在本例中为KeyEvent.KEY_PRESS)。但是,我希望其他人也能够注册在这种情况下具有优先权的处理程序,以便他们能够“覆盖”默认行为

当前,处理程序顺序似乎基于处理程序的插入顺序,但是我的处理程序总是先注册,因为它是在创建新实例时注册的

如何控制java fx中事件处理程序的优先级,以允许其他人注册在我启动之前触发的处理程序?

来自:

一个节点可以注册多个处理程序。每一个的顺序 根据事件类型的层次结构调用处理程序。处理者 对于特定的事件类型,在泛型的处理程序之前执行 事件类型。例如,KeyEvent.KEY_类型事件的处理程序 在InputEvent.ANY事件的处理程序之前调用。命令 其中未指定在同一级别执行两个处理程序, 但由 使用便利方法中描述的便利方法包括 最后执行

这意味着实际上没有办法保证在客户端代码处理程序之后调用处理程序;但是,如果为最通用的事件类型添加处理程序,
event.ANY
,则特定事件将在您的事件类型之前处理

例如:


在此示例中,将首先执行第一和第四个事件处理程序,但不按预定顺序执行。然后是第三个事件处理程序(因为它使用了便利方法),最后是第二个事件处理程序(因为它使用了最通用的事件类型)。

您能展示一下默认事件处理程序在源代码中的样子吗?
import javafx.application.Application;
import javafx.event.Event;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class EventPriorityTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane testPane = new Pane();
        testPane.setFocusTraversable(true);

        testPane.addEventHandler(MouseEvent.MOUSE_PRESSED, e -> 
            System.out.println("Mouse pressed handler added first"));

        testPane.addEventHandler(Event.ANY, e-> {
            if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
                System.out.println("Generic handler added second");
            }
        });

        testPane.setOnMousePressed(e -> 
            System.out.println("Mouse pressed handler added third via convenience method"));

        testPane.addEventHandler(MouseEvent.MOUSE_PRESSED, e -> 
            System.out.println("Mouse pressed handler added fourth"));

        Scene scene = new Scene(testPane, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}