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

标签 java vaadin

我有一个包含自定义组件的多行表格。我想允许用户拖放行。

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

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 或其他组件来实现此结果。我想与搜索此内容的任何人分享我的解决方案,因为我自己找不到直接而简单的答案。此外,我想为社区做些事情,因为我们使用了很多开源软件。

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

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 采样器中的“树到表拖放”示例,Nebras 在之前的帖子中提到过。

希望这篇文章能帮到别人。你好! :)

关于java - 如何允许用户在 vaadin 表中拖放行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433708/

相关文章:

vaadin - 在 Vaadin 中水平居中弹出窗口

java - java中如何将json数据导出到excel表中

java - 添加几个小的浮点值会溢出到无穷大

java - 如何编译多个相互依赖的java文件?

java - Eclipse Helios 3.6.1 调试 View 评估表达式不可用

java - 在关闭对话框窗口中单击下载按钮时,有时找不到 StreamResource 资源

java - Liquibase 找不到 Oracle 的 ChangeLogHistoryService

java - 尝试使用 vaadin 创建测试项目时出错

java - 如何在vaadin中创建多个ui页面

Vaadin Grid ItemClickListener 无法使用 ImageRenderer 注册对列的点击