从Nattable中删除行

时间:2015-08-09 18:07:20

标签: swt eclipse-rcp nebula nattable

我想在星云Nattable中实现行删除逻辑。 这就是我打算做的事情:

  1. 将上下文菜单添加到http://blog.vogella.com/2015/02/03/nattable-context-menus-with-eclipse-menus/
  2. 中描述的Nattable
  3. 将SWT操作添加到将实现删除的菜单
  4. 我的问题是,这是实现这一目标的最佳方式:

    • 我应该从数据模型中删除相应的值,并在执行this.natview.refresh();时刷新表格视图吗?
    • 我应该从SelectionLayer获取行并删除它们(如果是这样,我该怎么办?)?
    • 是否通过IConfiguration
    • 对此功能有任何默认支持

2 个答案:

答案 0 :(得分:3)

在NatTable中,您通常会执行以下操作:

  1. 创建删除行的命令

    public class DeleteRowCommand extends AbstractRowCommand {
    
        public DeleteRowCommand(ILayer layer, int rowPosition) {
            super(layer, rowPosition);
        }
    
        protected DeleteRowCommand(DeleteRowCommand command) {
            super(command);
        }
    
        @Override
        public ILayerCommand cloneCommand() {
            return new DeleteRowCommand(this);
        }
    
    }
    
  2. 为该命令创建命令处理程序

    public class DeleteRowCommandHandler<T> implements ILayerCommandHandler<DeleteRowCommand> {
    
        private List<T> bodyData;
    
        public DeleteRowCommandHandler(List<T> bodyData) {
            this.bodyData = bodyData;
        }
    
        @Override
        public Class<DeleteRowCommand> getCommandClass() {
            return DeleteRowCommand.class;
        }
    
        @Override
        public boolean doCommand(ILayer targetLayer, DeleteRowCommand command) {
            //convert the transported position to the target layer
            if (command.convertToTargetLayer(targetLayer)) {
                //remove the element
                this.bodyData.remove(command.getRowPosition());
                //fire the event to refresh
                targetLayer.fireLayerEvent(new RowDeleteEvent(targetLayer, command.getRowPosition()));
                return true;
            }
            return false;
        }
    
    }
    
  3. 将命令处理程序注册到正文DataLayer

    bodyDataLayer.registerCommandHandler(
            new DeleteRowCommandHandler<your type>(bodyDataProvider.getList()));
    
  4. 将菜单项添加到触发命令的菜单配置

    new PopupMenuBuilder(natTable)
            .withMenuItemProvider(new IMenuItemProvider() {
    
                @Override
                public void addMenuItem(NatTable natTable, Menu popupMenu) {
                    MenuItem deleteRow = new MenuItem(popupMenu, SWT.PUSH);
                    deleteRow.setText("Delete");
                    deleteRow.setEnabled(true);
    
                    deleteRow.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(SelectionEvent event) {
                            int rowPosition = MenuItemProviders.getNatEventData(event).getRowPosition();
                            natTable.doCommand(new DeleteRowCommand(natTable, rowPosition));
                        }
                    });
                }
            })
            .build();
    
  5. 使用此功能,您无需调用NatTable#refresh(),因为命令处理程序会触发RowDeleteEvent。我也不建议在这种情况下调用NatTable#refresh(),因为它可能会更改并刷新更多内容并且不会正确更新其他状态,这可以通过触发RowDeleteEvent来正确完成。 / p>

    请注意,显示的示例将删除打开上下文菜单的行。如果应删除所有选定的行,则应创建一个知道SelectionLayer的命令处理程序,并检索所选行,如另一个答案中所示。

答案 1 :(得分:0)

在我们的应用程序中,我们执行以下操作:

  1. 获取选定的行对象:

    SelectionLayer selectionLayer = body.getSelectionLayer();
    int[] selectedRowPositions = selectionLayer.getFullySelectedRowPositions();
    Vector<Your Model Objects> rowObjectsToRemove = new Vector<Your Model Objects>();
    
    for (int rowPosition : selectedRowPositions) {
        int rowIndex = selectionLayer.getRowIndexByPosition(rowPosition);
        rowObjectsToRemove .add(listDataProvider.getRowObject(rowIndex));
    }
    
  2. 从数据提供者

  3. 中删除它们
  4. 致电natTable.refresh()