2016-08-04 2 views
0

J'essaie de supprimer plus d'une ligne de NatTable. En suivant la solution décrite dans Delete rows from Nattable. J'ai créé une des classes suivantes: la classe de commande ressemble à ceci:Supprimer plusieurs lignes de Nattable

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

} 

Commande classe Handler:

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

} 

et la commande sera déclenchée sur en cliquant sur un 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(); 

lorsque j'essaie de supprimer les lignes, les lignes non sélectionnées sont supprimées. Cela ressemble à un problème avec la position de ligne à la conversion d'index de ligne. est la position de rangée à la conversion d'index de rangée correcte dans mon droit IMenuItemProvider?

Répondre

1

Il semble que vous effectuiez la conversion de position en index deux fois: une fois dans l'écouteur de sélection d'élément de menu et une fois dans le gestionnaire de commandes (en appelant convertToTargetLayer). Le premier n'est pas nécessaire.

+0

auparavant je n'utilisais pas 'getRowIndexByPosition' mais cela causait le même problème de suppression d'une autre ligne. – ssdimmanuel

1

Ce n'est pas un problème de NatTable, mais un problème sur la façon de travailler avec les collections. Vous devez supprimer les éléments en arrière si vous supprimez les éléments un par un. Sinon, les éléments des index changent pendant le traitement. Supposons que vous vouliez supprimer les éléments à l'index 1 et 2. Après avoir supprimé l'élément à l'index 1, les éléments ci-dessous monteront. Donc l'élément qui était auparavant sur l'index 2 sera sur l'index 1 maintenant, et l'élément à l'index 3 sera sur l'index 2. Donc la suppression de l'élément à l'index 2 dans l'itération suivante supprimera l'élément qui était avant sur l'index 3.

Je suggérerais de trier et d'inverser la collection d'index avant d'itérer pour retirer des éléments de la collection. Cela devrait fonctionner.

+0

J'ai changé ma méthode de Commandhandler comme ci-dessous – ssdimmanuel

+0

J'ai changé ma méthode Commandhandler 'doCommand' pour stocker les objets sélectionnés dans une ArrayList temporaire puis la supprimer par la méthode' ArrayList.remove (Object) '. Mais toujours le problème arrive. J'ai aussi une ligne de filtre. Je pourrais également remarquer que la méthode 'command.convertToTargetLayer (targetLayer)' retourne false si j'essaye de supprimer la première ligne. – ssdimmanuel

+0

Si le problème persiste avec cette approche, vous utilisez la mauvaise liste. Je suppose que le tableau montre le contenu de FilterList mais vous opérez sur la liste de base. Vous devriez vérifier que vous opérez sur la même instance de liste. –