JavaFX事件处理程序优先级

时间:2015-06-19 13:54:57

标签: java javafx

我有一个自定义组件,其中包含"默认"事件处理程序(在本例中为KeyEvent.KEY_PRESS)。但是我希望其他人也能够注册处理程序,在这种情况下获得优先权,这样他们就有能力覆盖"默认行为。

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

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

1 个答案:

答案 0 :(得分:2)

来自documentation

  

节点可以注册多个处理程序。每个的顺序   调用handler是基于事件类型的层次结构。处理程序   对于特定事件类型,在处理程序之前执行泛型   事件类型。例如,KeyEvent.KEY_TYPED事件的处理程序   在InputEvent.ANY事件的处理程序之前调用。命令   其中没有指定执行同一级别的两个处理程序,   除了由注册的处理程序   使用便利方法中描述的便利方法是   最后执行。

这意味着我们无法保证在客户端代码处理程序之后调用您的处理程序;但是,如果您为最通用的事件类型Event.ANY添加处理程序,那么将在您之前处理特定事件。

E.g:

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

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