使用gwt dnd在GWT中拖放

时间:2010-06-09 07:50:43

标签: gwt uibinder drag-and-drop flowpanel

我一直在努力让Drag and Drop在GWT中工作。最近3天,我试图创建一个基本的拖放应用程序并失败。目前我可以拖动它,但我无法放到任何位置。

  1. 我们如何解决?我们是否需要修改onDragEnd - 我的印象是,除非我特别要做某事,否则我不必这样做?我很困惑。

  2. 另外,如何限制掉落到任何一个区域?我明白我们可以使用DropController来做到这一点。但是我已经使用UiBinder定义了面板,那么如何在DropController中将该面板恢复为链接?即RootPanel.get()为我提供了基本的根面板,而不是我想要的实际面板。我尝试了RootPanel.get(“field-id”),但即使该ID可用,它也显示为null。我做错了什么?

  3. 我写的代码如下:

    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>
    

    如果有人可以帮助我,我将非常感激。

    ķ

    P.S:解释更多:我能够通过更新onDragEnd来解决第一个问题,如下所示:

        @Override
    public void onDragEnd(DragEndEvent event) {
        DragContext context = event.getContext();
        RootPanel.get().add(context.draggable, context.desiredDraggableX, context.desiredDraggableY);
    }
    

    但是,我不确定这是否是正确的解决方案 - 因为我认为我不应该自己做定位。

2 个答案:

答案 0 :(得分:0)

如果您是GWT dnd的新手,为什么不试试working demo

有很多例子,所有源代码都可用。

(不,你不应该自己做位置)

答案 1 :(得分:0)

您必须在放置目标上添加DragOverHandler:即使它什么都不做,它也会将该组件定义为放置目标。

当然,你仍然需要在这个组件上定义DropHandler(通常还有DragEnterHandler和DragLeaveHandler用于视觉反馈)。

即使未达到目标(拖放在非放置区域中拖动),也会调用DragEndHandler,它用于更改拖动对象的状态,您可能需要为DropHandler设置通信方式成功放入DragEndHandler(共享变量,EventBus等)。