2012-05-07 3 views
0

swtのtableViewerセル値を別のtableViewerセルにドラッグする必要があります。 ドラッグしてドロップすることができますがドロップできない場所をドロップすることができず、ドラッグアンドドロップすると値を削除して追加することができないので、ドラッグしてドロップできる値をドラッグして追加する必要がありますテーブルビューア。ここに私が持っている:助けのために事前に感謝します。あなたが使用することができ、選択した値を削除するSWTのテーブルビューアのドラッグアンドドロップ

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

答えて

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

を次の私は、TableViewerの上のドラッグ&ドロップを探していると解決策を見つけました。誰もが簡単に理解できると思っています。私の場合、DragSourceListener & DropTargetListenerから2つの新しいListenerクラスの継承を作成しました。なぜなら私はTableViewer関数を使いたいからです。あなたは3つのことが必要です。

まず最終void drop(DropTargetEvent event)からターゲットインデックスを見つけた後event.data

にデータを設定しvoid dragStart(DragSourceEvent 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)); 
} 

} 
関連する問題