首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Nattable中删除多行

从Nattable中删除多行
EN

Stack Overflow用户
提问于 2016-08-04 18:37:35
回答 2查看 265关注 0票数 0

我正在尝试从NatTable中删除多行。遵循Delete rows from Nattable中描述的解决方案。我已经创建了以下类: Command类如下所示:

代码语言:javascript
复制
public class DeleteMultiRowCommand extends AbstractMultiRowCommand {

    public DeleteMultiRowCommand(AbstractMultiRowCommand command) {
        super(command);
    }

    protected DeleteMultiRowCommand(ILayer layer, int[] rowPositions) {
        super(layer, rowPositions);
    }

    @Override
    public ILayerCommand cloneCommand() {
        return new DeleteMultiRowCommand(this);
    }

}

命令处理程序类:

代码语言:javascript
复制
public class DeleteMultiRowCommandHandler<T> implements ILayerCommandHandler<DeleteMultiRowCommand> {

    private List<T> bodyData;
    private SelectionLayer layer;

    public DeleteMultiRowCommandHandler(List<T> bodyData, SelectionLayer selectionLayer) {
        this.bodyData = bodyData;
        this.layer = selectionLayer;
    }

    public DeleteMultiRowCommandHandler(List<T> bodyData){
        this.bodyData = bodyData;
    }

    @Override
    public Class<DeleteMultiRowCommand> getCommandClass() {
        return DeleteMultiRowCommand.class;
    }

    @Override
    public boolean doCommand(ILayer targetLayer, DeleteMultiRowCommand command) {
        //convert the transported position to the target layer
        if (command.convertToTargetLayer(targetLayer)) {
            Collection<Integer>rowpos = command.getRowPositions();
            //remove the element
            for(Integer val : rowpos){
                this.bodyData.remove(val.intValue());
                targetLayer.fireLayerEvent(new RowDeleteEvent(targetLayer, val.intValue()));
            }

            return true;
        }
        return false;
    }

}

该命令将在单击MenuItem时触发

代码语言:javascript
复制
this.contextMenu = new PopupMenuBuilder(natTable)
            .withInspectLabelsMenuItem()
            .withClearAllFilters()
            .withColumnRenameDialog()
            .withMenuItemProvider(new IMenuItemProvider() {

                @Override
                public void addMenuItem(final NatTable natTable, Menu popupMenu) {
                    MenuItem deleteRow = new MenuItem(popupMenu, SWT.PUSH);
                    deleteRow.setText("Delete Row(s)");
                    deleteRow.setEnabled(true);

                    deleteRow.addSelectionListener(new SelectionAdapter() { 
                        @Override
                        public void widgetSelected(SelectionEvent event) {
                            //int rowPosition = MenuItemProviders.getNatEventData(event).getRowPosition();
                            ILayer bl = ((GridLayer)natTable.getLayer()).getBodyLayer();
                            BodyLayerStack bl1 = (BodyLayerStack) bl;
                            SelectionLayer sl = bl1.getSelectionLayer();
                            int []poss = new int[sl.getFullySelectedRowPositions().length];
                            int i=0;
                            for(int pos1 : sl.getFullySelectedRowPositions()){
                                poss[i]=sl.getRowIndexByPosition(pos1);
                                i++;
                            }
                            //System.out.println("Menu item selected "+rowPosition);
                            //natTable.doCommand(new DeleteRowCommand(natTable, rowPosition));
                            natTable.doCommand(new DeleteMultiRowCommand(natTable, poss));
                        }
                    });
                }
            })
            .build();

当我尝试删除行时,未选中的行也会被删除。这似乎是行位置到行索引转换的问题。在我的IMenuItemProvider中,行位置到行索引的转换是否正确?

EN

回答 2

Stack Overflow用户

发布于 2016-08-04 21:24:24

似乎您执行了两次从位置到索引的转换:一次是在菜单项选择侦听器中,另一次是在命令处理程序中(通过调用convertToTargetLayer)。第一个是不必要的。

票数 1
EN

Stack Overflow用户

发布于 2016-08-05 14:51:46

这不是NatTable的问题,而是关于如何使用集合的问题。如果逐个删除元素,则需要向后删除这些项。否则,索引的项在处理过程中会发生变化。

假设您要删除索引1和2处的元素。删除索引1处的元素后,下面的元素将向上移动。因此,以前在索引2上的元素现在将在索引1上,索引3上的元素将在索引2上。因此,在下一次迭代中删除索引2上的元素将删除以前在索引3上的项。

我建议在迭代之前对索引集合进行排序和反转,以便从集合中删除项。超过了它应该起作用的程度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38765024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档