События MouseDown не доставляются до MouseUp при наличии источника перетаскивания

у меня не будет слушателя мыши. В нем есть код для ответа на события mouseUp и mouseDown. Это работает правильно.

Однако, как только я добавляю DragSource, мое событие mouseDown больше не доставляется - пока я не отпущу кнопку мыши!

Воспроизвести это тривиально - ниже представлена ​​простая программа, которая содержит простая оболочка с только слушателем мыши и слушателем перетаскивания. Когда я запускаю это (на Mac) и нажимаю и удерживаю кнопку мыши, ничего не происходит, но как только я отпущу кнопку мыши, Я мгновенно вижу доставленные события «мышь вниз» и «вверх». Если я закомментирую источник перетаскивания, то события мыши доставляются так, как они должны быть.

Я искал других с аналогичными проблемами, и самое близкое к объяснению, которое я нашел, это:

https : //bugs.eclipse.org/bugs/show_bug.cgi? id = 26605 # c16 «Если вы перехватите обнаружение перетаскивания, операционная система должна поглощать события мыши, пока не определит, что вы перетащили или нет».

Однако я не понимаю, почему это правда - почему операционная система должна поглощать события мыши чтобы определить, есть ли у меня тормоз? Перетаскивание не начнется, пока у меня не будет события mouse -move- с нажатой кнопкой.

Что еще более важно: может ли кто-нибудь предложить обходной путь? (Я пробовал динамически добавлять и удалять источник перетаскивания при нажатии мыши, но потом мне не удалось заставить перетаскивание работать должным образом, так как он никогда не видел первоначального нажатия клавиши - и я не могу найти способ программно инициировать перетащите.)

Вот пример программы:

    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();
        }
    }

17
задан Tor Norbye 11 October 2010 в 16:54
поделиться