确定一个事件是否在JavaFX中被消费了

 2023-02-16    403  

问题描述

我正在尝试使用Javafx中的活动处理来做一些脱身工作.我需要能够确定在手动启动事件后是否消耗了事件.

在下面的示例中,正确接收了合成鼠标事件,但是调用campe()不更新事件.

确定一个事件是否在JavaFX中被消费了

我已经进行了调试,发现javafx实际上创建了一个新的事件实例,因此原件不变

public class EventManipulation extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button button = new Button();
        button.setOnMouseDragged(event -> {
            System.out.println("dragged");
            event.consume();
        });
        primaryStage.setScene(new Scene(new HBox(button), 400, 300));
        primaryStage.show();

        MouseEvent event = new MouseEvent(MouseEvent.MOUSE_DRAGGED, 0, 0, 0, 0, MouseButton.PRIMARY, 1, false, false,
                false, false, false, false, false, false, false, false, null);
        Event.fireEvent(button, event);
        System.out.println(event.isConsumed());  // <== prints false
    }
}

我已经发现了EventDispatchchain,但是我不知道如何使其工作.该按钮可以生成事件调度链,但需要一个开始…以下失败,因为我不知道如何创建初始尾巴.

Event result = button.buildEventDispatchChain(null).dispatchEvent(event);
System.out.println(result.isConsumed());

推荐答案

我为此提供的唯一解决方案是实现 eventdispatchchain 接口.相当最小的接口如下.不幸的是,Javafx使用的内置版本是在不可访问的软件包中 – com.sun.javafx.event.EventDispatchChainImpl

private class SimpleChain implements EventDispatchChain {

    private Deque<EventDispatcher> dispatchers = new LinkedList<>();

    @Override
    public EventDispatchChain append(EventDispatcher eventDispatcher) {
        dispatchers.addLast(eventDispatcher);
        return this;
    }

    @Override
    public EventDispatchChain prepend(EventDispatcher eventDispatcher) {
        dispatchers.addFirst(eventDispatcher);
        return this;
    }

    @Override
    public Event dispatchEvent(Event event) {
        if (dispatchers.peekFirst() != null) {
            Event result = dispatchers.removeFirst().dispatchEvent(event, this);
            if (result != null) {
                return result;
            } else {
                event.consume();
                return event;
            }
        } else {
            return event;
        }
    }
}

当使用这样的使用时,这将产生预期结果

Event result = button.buildEventDispatchChain(new SimpleChain()).dispatchEvent(event);
System.out.println(result.isConsumed());

以上所述是小编给大家介绍的确定一个事件是否在JavaFX中被消费了,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33969.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。