1

我想在 Nebula Nattable 中实现行删除逻辑。这是我打算做的:

  1. 将上下文菜单添加到http://blog.vogella.com/2015/02/03/nattable-context-menus-with-eclipse-menus/中描述的 Nattable
  2. 向菜单添加一个 SWT 操作,该操作将实现删除

我的问题是,这是实现这一目标的最佳方法:

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

2 回答 2

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();
    

使用它你不需要调用NatTable#refresh(),因为命令处理程序会触发RowDeleteEvent. 我也不建议NatTable#refresh()在这种情况下调用,因为它可能会更改和刷新更多,并且不会正确更新其他状态,这可以通过触发RowDeleteEvent.

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

于 2015-08-10T07:42:19.443 回答
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. 称呼natTable.refresh()
于 2015-08-09T19:57:12.787 回答