5

我正在创建一个树,用户可以使用gwt-dnd库通过将一个 TreeItem 拖放到另一个 TreeItem 来移动 TreeItem 。我读过我应该为每个 TreeItem 设置一个小部件,并使该小部件可拖动和一个 dropTarget。到目前为止,即使只是拖动 TreeItem,我也没有任何成功。我还得到一个“拖放未处理的异常”。我是否至少朝着正确的方向前进,还是有更好的方法来做到这一点?任何帮助是极大的赞赏!

// Create the boundary panel
AbsolutePanel main = new AbsolutePanel();
main.setSize("500px", "500px");
// Create Tree and tree root
Tree tree = new Tree();
TreeItem root = new TreeItem();
root.setText("root");
// Create Label widget and construct treeItem from Label
Label itemLabel = new Label("item1");
TreeItem item = new TreeItem(itemLabel);
// Create DragController for the main panel, and make the Label widget draggable
PickupDragController dragController = new PickupDragController(main, true);
dragController.makeDraggable(item.getWidget());
// Add everything to root panel
root.addItem(item);
tree.addItem(root);
main.add(tree);
RootPanel.get().add(main);
4

2 回答 2

0

我建议这里的入门指南。

查看如何向您的项目添加拖放功能

你缺少的是一个放置区。有些类实现了放置控制器,您应该使用它们。没有地方放的可拖动项目是没有意义的。

您还可以通过在事件上实现逻辑(OnDropStart 等)来覆盖 dnd 的某些功能

重要的!!!不要忘记将 DropController 注册到 PickupDragController。

这是来自 dnd 站点的示例

public AbsolutePositionExample(PickupDragController dragController) {
    super(dragController);
    addStyleName(CSS_DEMO_ABSOLUTE_POSITION_EXAMPLE);

    // use the drop target as this composite's widget
    AbsolutePanel positioningDropTarget = new AbsolutePanel();
    positioningDropTarget.setPixelSize(400, 200);
    setWidget(positioningDropTarget);

    // instantiate our drop controller
    absolutePositionDropController = new AbsolutePositionDropController(positioningDropTarget);
    dragController.registerDropController(absolutePositionDropController);
  }
于 2014-04-07T08:19:21.677 回答
0

无需使用gwt-dnd。只需用 a 包装TreeItem内容FocusPanel并使用其拖动事件处理程序。使用您的示例:

Tree tree = new Tree();
TreeItem root = new TreeItem();
root.setText("root");

Label itemLabel = new Label("item1");
FocusPanel wrapper = new FocusPanel(itemLabel);
TreeItem item = new TreeItem(wrapper);

wrapper.getElement().setDraggable(Element.DRAGGABLE_TRUE);

wrapper.addDragStartHandler(new DragStartHandler() {
    @Override
    public void onDragStart(DragStartEvent event) {
        GWT.log("Drag START!");
    }
});

wrapper.addDragEndHandler(new DragEndHandler() {
    @Override
    public void onDragEnd(DragEndEvent event) {
        GWT.log("Drag END!");
    }
});

wrapper.addDragOverHandler(new DragOverHandler() {
    @Override
    public void onDragOver(DragOverEvent event) {}
});

wrapper.addDropHandler(new DropHandler() {
    @Override
    public void onDrop(DropEvent event) {
        GWT.log("DROP!");
        event.preventDefault();
    }
});

root.addItem(item);
tree.addItem(root);
于 2015-12-31T03:26:16.653 回答