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”示例的启发. 我希望我能用这篇文章帮助别人.问候! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |