Я действительно изо всех сил пытаюсь заставить Drag and Drop работать в GWT. Последние 3 дня я пытался создать базовое приложение перетаскивания и потерпел неудачу. В настоящее время я могу перетащить его, но я не могу попасть в любое место.Перетаскивание в GWT с использованием gwt dnd
Как мы можем решить эту проблему? Нужно ли модифицировать onDragEnd - у меня создается впечатление, что, если я специально не должен что-то делать, мне не нужно? Я совершенно смущен.
Также, как ограничить падение в любую область? Я понимаю, что мы можем сделать это с помощью DropController. Но я определил панели с помощью UiBinder, так как я могу вернуть эту панель для ссылки в DropController? то есть RootPanel.get() дает мне основную панель корневого элемента, а не фактическую панель, которую я хочу. Я пробовал RootPanel.get («field-id»), но это показывает нуль, даже если этот идентификатор доступен. Что я делаю не так?
Код я написал следующим образом:
public class TestPanel extends Composite implements
DragHandler, HasMouseDownHandlers, HasMouseUpHandlers, HasMouseMoveHandlers, HasMouseOutHandlers {
interface Binder extends UiBinder<Widget, TestPanel> { }
private static final Binder binder = GWT.create(Binder.class);
@UiField AbsolutePanel absolutePanel;
private PickupDragController TestDragController;
private Image img = new Image("./testicon.png");
public TestPanel(){
initWidget(binder.createAndBindUi(this));
absolutePanel.add(img);
TestDragController = new PickupDragController(RootPanel.get(), false);
AbsolutePositionDropController dropController = new AbsolutePositionDropController(
RootPanel.get());
TestDragController.registerDropController(dropController);
TestDragController.addDragHandler(this);
TestDragController.makeDraggable(this, getDragHandle());
}
private Widget getDragHandle() {
return img;
}
@Override
public void onDragEnd(DragEndEvent event) { }
@Override
public void onDragStart(DragStartEvent event) { }
@Override
public void onPreviewDragEnd(DragEndEvent event) throws VetoDragException { }
@Override
public void onPreviewDragStart(DragStartEvent event) throws VetoDragException { }
@Override
public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
return addDomHandler(handler, MouseDownEvent.getType());
}
@Override
public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) {
return addDomHandler(handler, MouseUpEvent.getType());
}
@Override
public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
return addDomHandler(handler, MouseMoveEvent.getType());
}
@Override
public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
return addDomHandler(handler, MouseOutEvent.getType());
}
}
и testpanel UiBinder выглядит следующим образом:
<g:AbsolutePanel ui:field="absolutePanel" styleName="{style.panel}">
</g:AbsolutePanel>
Если кто-то может помочь мне, я буду очень Весьма признателен.
K
PS: Для того, чтобы объяснить больше: я был в состоянии решить первый вопрос, обновляя onDragEnd как:
@Override
public void onDragEnd(DragEndEvent event) {
DragContext context = event.getContext();
RootPanel.get().add(context.draggable, context.desiredDraggableX, context.desiredDraggableY);
}
, но я не уверен, является ли это правильное решение - так как я думаю, что я не должен сам позиционировать себя.