在SWT中拖放tableviewer

时间:2012-05-07 06:24:22

标签: drag-and-drop swt jface

我需要将tableViewer单元格值拖到swt中的另一个tableViewer单元格中。 我需要删除我拖动的值,并添加那些我放在tableViewer中的值我能够拖放但不能放下我想要的地方而且当我拖放tableviewer时无法移除和添加值。这是我的:提前感谢您的帮助。

public void DragandDrop(){

    Transfer[] types = new Transfer[] { TextTransfer.getInstance() };

    DragSource source = new DragSource(table_2, DND.DROP_MOVE | DND.DROP_COPY);
    source.setTransfer(types);
    source.addDragListener(new DragSourceAdapter() {
      public void dragSetData(DragSourceEvent event) {
        DragSource ds = (DragSource) event.widget;
        Table table = (Table) ds.getControl();
        TableItem[] selection = table.getSelection();

        StringBuffer buff = new StringBuffer();
        for (int i = 0, n = selection.length; i < n; i++) {
          buff.append(selection[i].getText());
        }
        event.data = buff.toString();
      }
    });

    DropTarget target = new DropTarget(table_3, DND.DROP_MOVE | DND.DROP_COPY );
    target.setTransfer(types);
    target.addDropListener(new DropTargetAdapter() {
      public void dragEnter(DropTargetEvent event) {
        if (event.detail != DND.DROP_DEFAULT) {
          event.detail = (event.operations & DND.DROP_COPY) != 0 ? DND.DROP_COPY : DND.DROP_NONE;
        }
        for (int i = 0, n = event.dataTypes.length; i < n; i++) {
          if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
            event.currentDataType = event.dataTypes[i];
          }
        }
      }

      public void dragOver(DropTargetEvent event) {
        event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
      }

      public void drop(DropTargetEvent event) {
        if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
          DropTarget target = (DropTarget) event.widget;
          Table table = (Table) target.getControl();
          String data = (String) event.data;

          TableItem item = new TableItem(table, SWT.NONE);
          item.setText(new String[] { data });
       //   table.redraw();
        }
      }
    });
}

2 个答案:

答案 0 :(得分:0)

删除您可以使用的选定值

public void drop(DropTargetEvent event) {
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
DropTarget target = (DropTarget) event.widget;
  Table table = (Table) target.getControl();
  String data = (String) event.data;
  TableItem item = new TableItem(table, SWT.NONE);
  item.setText(new String[] { data });
  //remove the tableitem you drag
  table.remove(table.getSelectionIndex());
 }   

答案 1 :(得分:0)

我在TableViewer上寻找Drag and Drop并找到解决方案。希望大家都轻松理解。我的情况是,我从DragSourceListener&amp;创建了两个新的Listener类继承。的DropTargetListener。因为我想使用TableViewer函数。你需要做三件事。

首先保存源项目的索引void dragStart(DragSourceEvent event)

秒将数据设置为event.data

然后上次找到void drop(DropTargetEvent event)的目标索引。

public class TestClass extends TableViewer {

private int sourceIndex;

priavte class DragListener implements DragSourceListener {
    private TableViewer viewer;

    public ItemDragListener(TableViewer viewer) {
        this.viewer = viewer;
    }

    public void dragStart(DragSourceEvent event) {
        sourceIndex = viewer.getTable().getSelectionIndex();
    }

    public void dragSetData(DragSourceEvent event) {
        // save data
        ISelection select = viewer.getSelection();
        if (select instanceof IStructuredSelection) {
            Object item = (Object) ((IStructuredSelection)select).getFirstElement();
            // save item to event.data
            event.data = .........
    }
     :
}

private class ItemDropListener implements DropTargetListener {
    TableViewer viewer;

    public ItemDropListener(TableViewer viewer) {
        this.viewer = viewer;
    }

    public void drop(DropTargetEvent event) {
        if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
          TableItem item = (TableItem)event.item;
          int targetIndex= -1;
          if (item != null) {
             Table table = item.getParent();
             targetIndex= table.indexOf(item);
          }
          String data = (String) event.data;

          // add an item
          if (targetIndex >= 0)
             viewer.insert((Object)data, targetIndex);
          else
             viewer.add((Object)data);

          // remove an item
          viewer.getTable().remove(sourceIndex);  // Careful, it can be changed after add an item
        }
      }

public void init() {
    Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() };
    this.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE, transfers, new    ItemDragListener(this));
    this.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, transfers, new ItemDropListener(this));
}

}