У меня есть слушатель мыши. Он имеет некоторый код для ответа на события 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();
}
}