【问题标题】:Custom drag detection in SWT widgetsSWT 小部件中的自定义拖动检测
【发布时间】:2011-07-15 11:31:49
【问题描述】:

在我基于 SWT 的应用程序中,我有一个 Canvas 派生的自定义小部件,它显示了一堆“项目”。这些项目的全部目的是让用户将它们拖出小部件。我毫不费力地实现了 DragSource、DragDetectListener 和所有使 DND 工作的东西。我要解决的问题是我希望比默认平台行为更早地检测到拖动,即在更短的鼠标拖动距离之后。

我知道我可以覆盖 Widget 类的 dragDetect()。然而,这只允许我否决超类的实现,而不是通知在超类认为它已经发生之前已经发生了拖动。

基本上,如果我可以自己生成拖动事件,例如我可以使用 Widget.postEvent(SWT.DragDetect, eventWhichIAllocatedAndFilledOut) (这是包私有的),那似乎是我的解决方案。我查看了 Widget 中的拖动检测代码,它似乎不是为这个用例设计的。是否有解决方法让我可以随时启动拖动?

【问题讨论】:

    标签: java drag-and-drop swt


    【解决方案1】:

    我想通了。可以生成自定义事件并将其分发到 DragDetect 侦听器机制。下面的代码与内部实现相同,但可以在 Widget 实现中随意调用,例如从 MouseMoveListener 的 mouseMove(MouseEvent e) 钩子调用:

    Event event = new Event();
    event.type = SWT.DragDetect;
    event.display = getDisplay();
    event.widget = this;
    event.button = e.button;
    event.stateMask = e.stateMask;
    event.time = e.time;
    event.x = e.x;
    event.y = e.y;
    
    notifyListeners(SWT.DragDetect, event);
    

    值得注意的是,必须禁用内置的拖动检测才能按预期工作。默认实现通过可从 mouseDown() 处理程序调用的 dragDetect(MouseEvent e) 方法公开(如 dragDetect() 文档中所述)。它通过在事件线程中忙循环来工作,直到检测到拖动。它至少从 GTK 后端的本机事件队列中简单地使用鼠标移动事件。当一个 DragDetectListener 注册到 Widget 时,这将自动完成,因此除非通过 setDragDetect(false) 禁用该机制,否则自定义拖动检测只会在内置检测之后运行,因为它阻塞了事件,这会施加延迟线程,当然,除了第二次检测拖动。

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 2010-10-29
      • 2020-10-04
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多