【问题标题】:Can I listen for all drag & drop events in java?我可以在 java 中监听所有拖放事件吗?
【发布时间】:2014-02-17 09:02:16
【问题描述】:

我想监听 Swing 上的所有拖放事件。

我设法监听拖动事件的一种方法是添加:

final long mask = AWTEvent.MOUSE_EVENT_MASK + AWTEvent.MOUSE_MOTION_EVENT_MASK;

AWTEventListener eventListener = new AWTEventListener() {
    public void eventDispatched(final AWTEvent event) {}
};
Toolkit.getDefaultToolkit().addAWTEventListener(eventListener, mask);

但这并没有得到放置事件,甚至在放置时也没有从鼠标释放事件。 有没有办法拦截应用程序中的所有拖放事件,而不是分别在每个组件上?

【问题讨论】:

  • 我想记录用户所做的一切,提取场景,然后在这些场景上创建自动化测试。
  • 雄心勃勃 :-) 全局监听器级别非常低,因此您将获得原始的鼠标/运动事件,但很可能没有任何更高级别的事件,例如 dragEvent/dropEvent。不过没试过。顺便说一句,mouseMotion != 鼠标,要获得释放/按下以及移动/拖动,您还必须添加后一个蒙版
  • 我错过了在问题中添加它,因为我希望它尽可能简短和简洁。我修改了问题中的掩码,因为我目前正在使用它,但即便如此释放事件没有被捕获,所以我认为它被丢弃事件消耗了。
  • 是的,刚刚检查过:所有 dropXXEvents 甚至都不是 AWTEvents,因此 AWTEventListner 无法访问。并且系统在拖动操作时会吞下所有鼠标事件。有趣的问题!
  • d&d 事件不扩展 AWTEvent 的事实让我怀疑从一开始就拦截它们的可能性。我希望在 java.awt.dnd 或 java.awt.dnd.peer 包中有某种我错过的全局监听器。无论如何,我认为做我想做的事情的一种方法是通过一个 util 类安装所有拖动支持,该类接收一个包装在日志装饰器中的委托,但我认为这太过分了。

标签: java swing drag-and-drop awt


【解决方案1】:

这不是满足您要求的完整(甚至可能不是可行的 ;-) 解决方案,但可能会帮助您入门。

如前所述,所有低级输入事件(如 mouseEvents,取决于底层操作系统可能还有其他事件)在拖动过程中被 dnd 子系统吞噬。在内部,它们被转换为 DragXXEvents,而 DragXXEvents 又由 DragSource 触发。 dragSource 是一个单例,可在所有 dnd 操作中重复使用。所以一种方法可能是:

  • 获取全局 DragSource
  • 注册一个 DragSource/Motion/Listener
  • 根据需要监控来自 DragSourceEvent 的信息

一些sn-p:

DragSource source = DragSource.getDefaultDragSource();
DragSourceMotionListener dsml = new DragSourceMotionListener() {

    @Override
    public void dragMouseMoved(DragSourceDragEvent dsde) {
        debug(dsde);
    }
};
source.addDragSourceMotionListener(dsml);

// just some logging
protected void debug(DragSourceEvent dsde) {
    DragSourceContext context = dsde.getDragSourceContext();
    Component source = context.getComponent();
    String text = source != null ? source.getName() : "none";
    LOG.info(text + " x/y " + dsde.getX() + "/" + dsde.getY());
}

还有很多工作要做......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2015-02-03
    • 2016-12-06
    • 2015-09-17
    相关资源
    最近更新 更多