3

GWT でドラッグ アンド ドロップを機能させるのに本当に苦労しています。過去 3 日間、基本的なドラッグ アンド ドロップ アプリケーションを作成しようとして失敗しました。現在、ドラッグすることはできますが、どこにもドロップできません。

  1. どうすれば解決できますか?onDragEnd を変更する必要がありますか?特に何かをする必要がない限り、変更する必要はないという印象を受けましたか? 私はかなり混乱しています。

  2. また、ドロップを特定のエリアに制限するにはどうすればよいですか? DropController を使用して実行できることは理解しています。しかし、UiBinder を使用してパネルを定義したので、そのパネルを DropController でリンクするように戻すにはどうすればよいですか? つまり、RootPanel.get() は、必要な実際のパネルではなく、基本的なルート パネルを提供します。RootPanel.get("field-id") を試しましたが、その ID が使用可能であっても null が表示されます。私は何を間違っていますか?

私が書いたコードは次のとおりです。

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);
}

しかし、これが正しい解決策であるかどうかはわかりません。自分でポジショニングを行うべきではないと思うからです。

4

2 に答える 2

0

ドロップ ターゲットに DragOverHandler を追加する必要があります。何もしない場合でも、コンポーネントをドロップ ターゲットとして定義します。

もちろん、このコンポーネントにも DropHandler を定義する必要があります (一般的に、視覚的なフィードバックのために、オプションで DragEnterHandler と DragLeaveHandler を定義する必要があります)。

DragEndHandler は、ターゲットに到達しなくても呼び出されます (ドラッグが非ドロップ領域で放棄された場合)。ドラッグされたオブジェクトの状態を変更するために使用されます。DropHandler がドロップ時に成功を伝える方法を設定する必要がある場合があります。 DragEndHandler (共有変数、EventBus など) へ。

于 2013-02-19T10:11:43.167 に答える
0

GWT dnd を初めて使用する場合は、動作するデモを試してみませんか?

多くの例があり、すべてのソース コードが利用可能です。

(いいえ、自分でポジショニングを行うことは想定されていません)

于 2010-08-09T19:07:03.453 に答える