Если вы хотите перетащить составной виджет, вам нужно иметь ссылку на «дескриптор перетаскивания», который является одним из элементов в составном виджете, который реализует HasAllMouseHandlers
. Самый простой (и, на мой взгляд, самый чистый) способ сделать это - заставить составной виджет расширить интерфейс HasDragHandle
, для которого в составном виджете должен быть метод:
Widget getDragHandle();
интерфейс явно не говорит вам об этом, но возвращаемый виджет должен быть виджетом, реализующим интерфейс HasAllMouseHandlers
(иначе вы получите ошибку времени выполнения).
(Некомпозитные виджеты, реализующие HasAllMouseHandlers
, могут использоваться напрямую)
Я бы рекомендовал использовать Label в качестве маркера перетаскивания (он не должен содержать какой-либо текст, его можно просто стилизовать, чтобы пользователь понял, что его можно использовать для перетаскивания), а не элемент формы, потому что тогда перегрузить его поведение так, как пользователь, скорее всего, не будет ожидать. Я не совсем уверен, как отключенный элемент будет работать как дескриптор перетаскивания, вполне возможно, что отключение элемента остановит работу любых списков мыши, поэтому он не будет работать как дескриптор перетаскивания (хотя и не пробовал).