我有一个具有“默认”事件处理程序(本例中为KeyEvent.KEY_PRESS)的自定义组件。但是,我希望其他人也能够注册处理程序,在这种情况下,这些处理程序具有优先权,这样他们就能够“覆盖”默认行为。
当前,处理程序顺序似乎基于处理程序的插入顺序,但是我的处理程序总是首先注册,因为它是在创建新实例时注册的。
如何控制java中事件处理程序的优先级,以允许其他人注册在我的处理程序之前触发的处理程序?
发布于 2015-06-19 07:28:05
来自文档
节点可以注册多个处理程序。调用每个处理程序的顺序基于事件类型的层次结构。特定事件类型的处理程序在泛型事件类型的处理程序之前执行。例如,在KeyEvent.KEY_TYPED事件的处理程序之前调用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);
}
}
在本例中,将首先执行第一和第四事件处理程序,但不按预定顺序执行。然后是第三个事件处理程序(因为它使用了方便的方法),最后是第二个事件处理程序(因为它使用了最通用的事件类型)。
https://stackoverflow.com/questions/30939964
复制