我有一个带有“默认”事件处理程序的自定义组件(在这种情况下为KeyEvent.KEY_PRESS)。但是,我希望其他人也能够注册在这种情况下具有优先权的处理程序,以便他们能够“覆盖”默认行为。
当前,处理程序的顺序似乎是基于处理程序的插入顺序的,但是我的处理程序始终是首先注册的,因为它是在创建新实例时注册的。
如何控制java fx中事件处理程序的优先级,以允许其他人注册在我的事件之前触发的处理程序?
最佳答案
从documentation:
一个节点可以注册多个处理程序。每个的顺序
处理程序的调用基于事件类型的层次结构。处理程序
对于特定事件类型,在通用处理程序之前执行
事件类型。例如,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);
}
}
在此示例中,第一和第四事件处理程序将首先执行,但不按预定顺序执行。然后是第三个事件处理程序(因为它使用了便捷方法),最后是第二个事件处理程序(因为它使用了最通用的事件类型)。