Пользовательское обнаружение перетаскивания в виджетах SWT - PullRequest
3 голосов
/ 15 июля 2011

В моем приложении на базе SWT у меня есть пользовательский виджет, полученный из Canvas, который отображает кучу «элементов». Вся цель этих элементов заключается в том, чтобы пользователь перетянул их из виджета. У меня не было проблем с реализацией DragSource, DragDetectListener и всего такого, чтобы заставить DND работать. Проблема, которую я пытаюсь решить, состоит в том, что я хочу, чтобы перетаскивание было обнаружено намного раньше, то есть после гораздо более короткого расстояния перетаскивания мыши, чем поведение платформы по умолчанию.

Я знаю, что могу переопределить dragDetect () класса Widget. Однако это позволяет мне наложить вето на реализацию суперкласса, а не уведомлять о том, что перетаскивание уже произошло до того, как суперкласс сочтет, что оно произошло.

В принципе, если бы я мог сам генерировать событие перетаскивания, как если бы я мог просто использовать Widget.postEvent (SWT.DragDetect, eventWhichIAllocatedAndFilledOut) (который является частным пакетом), это было бы похоже на мое решение. Я посмотрел на код для обнаружения перетаскивания в Widget, и он, похоже, не предназначен для этого варианта использования. Есть ли какая-то работа, позволяющая мне в любое время инициировать перетаскивание?

1 Ответ

3 голосов
/ 16 июля 2011

Я понял это.Можно сгенерировать пользовательское событие и распространить его на механизм слушателя DragDetect.Приведенный ниже код делает то же самое, что и внутренняя реализация, но может вызываться по желанию из реализации Widget, например, из ловушки mouseMove (MouseEvent e) MouseMoveListener:

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

Примечательно, что встроенная-для обнаружения перетаскивания должно быть отключено, чтобы это работало как задумано.Реализация по умолчанию предоставляется с помощью метода dragDetect (MouseEvent e), который можно вызывать из обработчика mouseDown () (как описано в документации для dragDetect ()).Он работает путем зацикливания в потоке событий, пока не будет обнаружено перетаскивание.Он просто потребляет события перемещения мыши из собственной очереди событий по крайней мере на бэкэнде GTK.Когда DragDetectListener зарегистрирован в Widget, это будет сделано автоматически, поэтому, если не отключить механизм с помощью setDragDetect (false), пользовательское обнаружение перетаскивания будет выполняться только после встроенного обнаружения, которое налагает задержку, потому что оно блокирует событиенить, кроме обнаружения перетаскивания во второй раз, конечно.

...