【问题标题】:Drag and drop for tableviewer in SWT在 SWT 中拖放表格查看器
【发布时间】:2017-02-07 19:37:10
【问题描述】:

我需要将 tableViewer 单元格值拖动到 swt 中的另一个 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();
        }
      }
    });
}

【问题讨论】:

    标签: drag-and-drop swt jface


    【解决方案1】:

    要删除选定的值,您可以使用以下方法

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

    【讨论】:

      【解决方案2】:

      我在 TableViewer 上寻找拖放并找到了解决方案。希望大家容易理解。我的情况是,我从 DragSourceListener 和 DropTargetListener 创建了两个新的 Listener 类继承。因为我想使用 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));
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多