【问题标题】:What is the meaning of Event consumes in JavaFXJavaFX中事件消费的含义是什么
【发布时间】:2016-06-14 13:22:48
【问题描述】:

我试图理解 Event Handling in JavaFX 并在那里找到了这条线。

路由可以修改为事件过滤器和事件处理程序 路线处理事件。此外,如果事件过滤器或事件处理程序 在任何时候消费事件,初始路由上的一些节点可能 没有收到事件。

你能解释一下事件消费是什么意思吗?

【问题讨论】:

    标签: java events javafx


    【解决方案1】:

    事件沿特定路线传递。在大多数情况下(例如鼠标/键事件),路线将从 Scene 的根 Node 开始,并包含场景图中从根 Node 到目标 Node 的路径上的每个 Node .在到目标 Node 的路由上,事件 filters 被执行,如果这些过滤器中的任何一个应该消耗该事件,这将停止对该事件的任何进一步处理。一旦事件到达目标Node,如果“旅行”回到根,沿途调用任何事件handler。通过使用事件也可以在那里停止事件处理。

    例子:

    @Override
    public void start(Stage primaryStage) {
        Rectangle rect = new Rectangle(50, 50);
    
        StackPane root = new StackPane(rect);
    
        rect.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> {
            System.out.println("rect click(filter)");
    //      evt.consume();
        });
        root.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> {
            System.out.println("root click(filter)");
    //        evt.consume();
        });
    
        root.setOnMouseClicked(evt -> {
            System.out.println("root click(handler)");
    //      evt.consume();
        });
        rect.setOnMouseClicked(evt -> {
            System.out.println("rect click(handler)");
    //      evt.consume();
        });
    
        Scene scene = new Scene(root, 200, 200);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    如果您单击rect,事件处理将从root Node 开始。这里执行过滤器。如果事件没有在过滤器中消费,则将其传递给rectNode,事件过滤器在此接收事件。如果过滤器没有使用该事件,rect 的事件处理程序将接收该事件。如果该事件未被该事件处理程序消费,则root 的事件处理程序Node 接收该事件。

    只需取消注释一些evt.consume() 调用,看看会发生什么...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2021-10-26
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多