GWT拖放TreeItem

时间:2013-01-11 18:26:15

标签: gwt drag-and-drop

我正在创建一个树,用户可以通过使用gwt-dnd库将一个TreeItem拖放到另一个TreeItem上来移动TreeItems。我已经读过我应该为每个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);

2 个答案:

答案 0 :(得分:0)

我建议使用入门指南here

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

你缺少的是掉落区域。有些类实现了drop控制器,你应该使用它们。拥有无法放下的拖拉物品毫无意义。

您还可以通过在事件上实现逻辑(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);
  }

答案 1 :(得分:0)

无需使用gwt-dnd。只需使用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);