【发布时间】:2023-04-05 13:04:02
【问题描述】:
我有一个鼠标监听器。它有一些代码来响应 mouseUp 和 mouseDown 事件。这可以正常工作。
但是,一旦我添加了 DragSource,我的 mouseDown 事件就不再传递 - 直到我释放鼠标按钮!
这很容易重现 - 下面是一个简单的程序,它包含一个普通的外壳,只有一个鼠标监听器和一个拖动监听器。当我(在 Mac 上)运行它并按住鼠标按钮时,什么也没有发生 - 但是只要我松开鼠标按钮,我就会立即看到鼠标按下和鼠标按下事件都已传递。如果我注释掉拖动源,那么鼠标事件将按应有的方式传递。
我已经搜索过其他有类似问题的人,我找到的最接近解释的是:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=26605#c16 “如果你挂钩拖动检测,操作系统需要吃掉鼠标事件,直到它确定你有没有拖动。”
但是,我不明白为什么这是真的——为什么操作系统必须吃掉鼠标事件来确定我是否有拖动?直到我按下按钮时鼠标移动事件才会开始拖动。
更重要的是:任何人都可以提出解决方法吗? (我尝试在按下鼠标时动态添加和删除我的拖动源,但是由于它从未看到初始按键,因此我无法正常进行拖放操作 - 而且我找不到以编程方式启动的方法拖动。)
这是示例程序:
package swttest;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SwtTest {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
System.out.println("mouseUp");
}
public void mouseDown(MouseEvent e) {
System.out.println("mouseDown");
}
public void mouseDoubleClick(MouseEvent e) {
System.out.println("mouseDoubleClick");
}
});
DragSourceListener dragListener = new DragSourceListener() {
public void dragFinished(DragSourceEvent event) {
System.out.println("dragFinished");
}
public void dragSetData(DragSourceEvent event) {
System.out.println("dragSetData");
}
public void dragStart(DragSourceEvent event) {
System.out.println("dragStart");
}
};
DragSource dragSource = new DragSource(shell, DND.DROP_COPY | DND.DROP_MOVE);
dragSource.addDragListener(dragListener);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
【问题讨论】:
-
我已经尝试过了,您的代码在 Windows 上运行。可能是特定于操作系统的错误
-
我刚刚在 Ubuntu 10.04 上试过这个,它有点工作。按下鼠标左键你没有得到任何事件。移动鼠标同时获得
mouseDown和dragStart。当你放手时,你会得到mouseUp事件。如果您保持鼠标不动并按下左键,您会在明显的 1-2 秒延迟后收到mouseDown。无论哪种方式,在放开鼠标之前总会看到mouseDown。一定是 Mac 上的 SWT 问题? -
谢谢你们 - 听起来这绝对是特定于平台的。但是,听起来它在 Linux 上也很糟糕——在传递 mouseDown 之前延迟一秒是行不通的,因为我试图将一些处理从 mouseUp 切换到 mouseDown 的原因是为了让 UI 感觉更灵敏。 .
-
我今天能够在 Windows 上进行测试(Vista,使用最新版本的 SWT),但我看不到 nanda 看到的内容 - 对我来说,它的损坏方式与它的打开方式相同Linux:mouseDown 事件不会立即传递;它不像在 Mac 上那样无限期举行,而是在一秒钟后交付(但这似乎是因为在 Windows 上它考虑按住按钮一秒钟拖动,所以一秒钟后它发布了一个 dragStart 事件,当然也像在 Mac 上一样触发 mouseDown。)
-
救命问题!谢谢托尔!
标签: swt eclipse-rcp