2010-06-09 4 views
3

Я действительно изо всех сил пытаюсь заставить Drag and Drop работать в GWT. Последние 3 дня я пытался создать базовое приложение перетаскивания и потерпел неудачу. В настоящее время я могу перетащить его, но я не могу попасть в любое место.Перетаскивание в GWT с использованием gwt dnd

  1. Как мы можем решить эту проблему? Нужно ли модифицировать onDragEnd - у меня создается впечатление, что, если я специально не должен что-то делать, мне не нужно? Я совершенно смущен.

  2. Также, как ограничить падение в любую область? Я понимаю, что мы можем сделать это с помощью 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); 
} 

, но я не уверен, является ли это правильное решение - так как я думаю, что я не должен сам позиционировать себя.

ответ

0

Если вы новичок в GWT dnd, почему бы вам не попробовать working demo?

Существует множество примеров и доступен весь исходный код.

(И нет, вы не должны делать позиционирование себя)

0

Вы должны добавить DragOverHandler на цели (ы) падения: даже если он ничего не делает, он определяет компонент в виде капли цель.

Конечно, вам необходимо определить DropHandler тоже на этом компоненте (и, возможно, DragEnterHandler и DragLeaveHandler для визуальной обратной связи в целом).

DragEndHandler вызывается, даже если цель не достигнута (перетаскивание заброшено в области без отбрасывания), оно используется для изменения состояния перетаскиваемого объекта, вам может потребоваться установить способ для DropHandler сообщать об успешности при переходе на DragEndHandler (общая переменная, EventBus и т. д.).

Смежные вопросы