2010-06-09 90 views
3

我一直在努力讓拖放工作在GWT中。最近3天,我試圖創建一個基本的拖放應用程序並失敗。目前我可以拖動它,但我無法放到任何位置。使用gwt拖放GWT使用gnd dnd

  1. 我們該如何解決?我們是否需要修改onDragEnd - 我的印象是,除非我特別需要做點什麼,否則我不需要?我很困惑。

  2. 另外,如何限制掉落到任何一個區域?我明白我們可以使用DropController來完成它。但是我已經使用UiBinder定義了面板,那麼如何讓該面板返回到DropController中的鏈接?即RootPanel.get()爲我提供了基本的根面板,而不是我想要的實際面板。我試過RootPanel.get(「field-id」),但是即使該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()); 
} 
} 

和パUiBinder的如下所示:

<g:AbsolutePanel ui:field="absolutePanel" styleName="{style.panel}"> 
</g:AbsolutePanel> 

如果有人能幫助我,我會很多謝。

ķ

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

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

(不,你不應該做positionning自己)

0

你必須在放置目標(S)添加DragOverHandler:即使什麼都不做,它的組件定義爲降目標。

當然,您仍然需要在該組件上定義DropHandler(可選地,也可以使用DragEnterHandler和DragLeaveHandler進行視覺反饋)。

即使未達到目標(拖放放置在非拖放區域中),也會調用DragEndHandler,它用於更改拖動對象的狀態,您可能需要爲DropHandler設置一種方式來通過拖放到DragEndHandler(共享變量,EventBus等)來傳達成功。