在 NatTable 中,您通常会执行以下操作:
创建用于删除行的命令
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);
}
}
为该命令创建一个命令处理程序
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;
}
}
将命令处理程序注册到主体 DataLayer
bodyDataLayer.registerCommandHandler(
new DeleteRowCommandHandler<your type>(bodyDataProvider.getList()));
将菜单项添加到触发命令的菜单配置
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
的行,您应该创建一个知道并检索选定行的命令处理程序,如另一个答案所示。