0

から複数の行を削除しようとしていNatTableます。Nattable からの行の削除で説明されているソリューションに従います。次のクラスを作成しました: Command クラスは次のようになります。

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

}

コマンド ハンドラー クラス:

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;
    }

}

Command は、MenuItem をクリックするとトリガーされます。

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ですか?

4

2 に答える 2

1

これは NatTable の問題ではなく、コレクションの操作方法の問題です。要素を 1 つずつ削除する場合は、アイテムを後方に削除する必要があります。そうしないと、処理中にインデックスの項目が変更されます。

インデックス 1 と 2 の要素を削除するとします。インデックス 1 の要素を削除すると、下の要素が上に移動します。そのため、以前にインデックス 2 にあった要素はインデックス 1 になり、インデックス 3 の要素はインデックス 2 になります。したがって、次の反復でインデックス 2 の要素を削除すると、以前にインデックスにあった項目が削除されます。 3.

コレクションからアイテムを削除するために反復する前に、インデックスのコレクションを並べ替えて逆にすることをお勧めします。それよりもうまくいくはずです。

于 2016-08-05T06:51:46.173 に答える
1

位置からインデックスへの変換を2回行っているようです.1回はメニュー項目選択リスナーで、もう1回はコマンドハンドラーで(を呼び出してconvertToTargetLayer)。最初は必要ありません。

于 2016-08-04T13:24:23.620 に答える