我有一個鼠標偵聽器。它有一些代碼來響應mouseUp和mouseDown事件。這工作正常。MouseDown事件直到MouseUp時纔會傳遞,當拖動源存在時
但是,只要我添加一個DragSource,我的mouseDown事件就不再傳遞 - 直到我釋放鼠標按鈕!
這很容易重現 - 下面是一個簡單的程序,它包含一個只有鼠標監聽器和一個拖拽監聽器的純shell。當我運行這個程序(在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上工作。可能是操作系統特定的錯誤 – nanda 2010-10-13 11:49:44
我剛剛在Ubuntu 10.04上試過這個,它有點作品。按下鼠標左鍵不會發生任何事件。移動鼠標,同時獲得'mouseDown'和'dragStart' * *。當你放開時,你會得到'mouseUp'事件。如果你仍然按住鼠標左鍵,你會在1-2秒的延遲後得到一個'mouseDown'。無論哪種方式,在放開鼠標之前總會看到'mouseDown'。必須是Mac上的SWT問題? – richq 2010-10-17 14:18:36
謝謝你們 - 聽起來這絕對是平臺特定的。但是,它聽起來像在Linux上也很糟糕 - 在傳遞mouseDown之前的一秒延遲將不起作用,因爲我試圖將某些處理從mouseUp切換到mouseDown的原因是爲了使UI更加響應.. – 2010-10-18 16:20:44