加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何允许用户在vaadin表中拖放行?

发布时间:2020-12-15 02:12:08 所属栏目:Java 来源:网络整理
导读:我有一个包含自定义组件的多行的表.我想允许用户拖放行. 我尝试过以下代码,但无法拖动任何行: tblStructure = new Table();tblStructure.setSizeFull();tblStructure.setSelectable(false);tblStructure.setSortEnabled(false);tblStructure.setDragMode(Ta
我有一个包含自定义组件的多行的表.我想允许用户拖放行.

我尝试过以下代码,但无法拖动任何行:

tblStructure = new Table();
tblStructure.setSizeFull();
tblStructure.setSelectable(false);
tblStructure.setSortEnabled(false);
tblStructure.setDragMode(Table.TableDragMode.ROW);
tblStructure.setNullSelectionAllowed(true);
tblStructure.setDropHandler(new DropHandler() {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        public AcceptCriterion getAcceptCriterion() {
            return AcceptAll.get();
        }

        @Override
        public void drop(DragAndDropEvent event) {
        }
    });

解决方法

我知道我正在回应一个旧线程.我发现在Vaadin中可能会非常麻烦.我拒绝使用TreeTable或其他组件来实现此结果.我想与搜索此内容的任何人分享我的解决方案,因为我自己找不到简单明了的答案.我也想为社区做点什么,因为我们使用了很多开源软件.

创建一个类,例如SortableTable,它扩展了常规的Vaadin表.

public class SortableTable extends Table {
    private static final long serialVersionUID = 1L;

    public SortableTable() {
        setDragMode(TableDragMode.ROW);
        setSelectable(true);
        setDropHandler(new DropHandler() {
            private static final long serialVersionUID = 1L;

            @Override
            public AcceptCriterion getAcceptCriterion() {
                return AcceptAll.get();
            }

            @Override
            public void drop(DragAndDropEvent event) {
                Transferable t = event.getTransferable();
                Object sourceItemId = t.getData("itemId");

                AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails)event.getTargetDetails();
                Object targetItemId = dropData.getItemIdOver();

                switch(dropData.getDropLocation()) {
                case BOTTOM:
                    moveAfter(targetItemId,sourceItemId);
                    break;
                case MIDDLE:
                case TOP:
                    final Object prevItemId = prevItemId(targetItemId);
                    moveAfter(prevItemId,sourceItemId);
                    break;
                }
            }
        });
    }
...

接下来,创建此自定义函数以移动表项.

@SuppressWarnings("unchecked")
    /**
     * 
     * @param targetItemId
     * @param sourceItemId
     * @return ItemId of the object the item moved to
     */
    public Object moveAfter(Object targetItemId,Object sourceItemId) {
        if(sourceItemId == null)
            return null;
        Item sourceItem = getItem(sourceItemId);

        Object[] propertyIds = getContainerPropertyIds().toArray();
        int size = propertyIds.length;
        Object[][] properties = new Object[size][2];

        // backup source item properties and values
        for(int i = 0; i < size; i++) {
            Object propertyId = propertyIds[i];
            Object value = sourceItem.getItemProperty(propertyId).getValue();
            properties[i][0] = propertyId;
            properties[i][1] = value;
        }
        removeItem(sourceItemId);
        Item item = addItemAfter(targetItemId,sourceItemId);

        // restore source item properties and values
        for(int i = 0; i < size; i++) {
            Object propertyId = properties[i][0];
            Object value = properties[i][1];
            item.getItemProperty(propertyId).setValue(value);
        }

        return sourceItemId;
    }


}

我们试着解释一下.由于某些显而易见的原因,在调用removeItem时,表项完全被删除并从表中删除.除了将其属性和值复制到新行之外,无法将同一对象放回到表中.这正是自定义moveAfter所做的.代码的另一部分受到内布拉斯在之前的帖子中提到的Vaadin采样器中的“Tree to Table drag-‘n-drop”示例的启发.

我希望我能用这篇文章帮助别人.问候!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读