SWT Tips and Samples 基礎編 > テキストのドラッグ&ドロップ |
|
テキストのドラッグ&ドロップテキストをウィジェット間でドラッグ&ドロップする方法を説明します。ドラッグ&ドロップを実装するには、ドラッグされる側であるコンポーネントを示すDragSourceと、ドロップされるコンポーネントを示すDropTargetという二つのオブジェクトを準備する必要があります。 DragSourceをSWTのリストウィジェットを使って実装すると以下のようになります。DragSourceコンストラクタに、ドラッグされたときのアクションタイプを指定できます。この例の場合は、DND.DROP_MOVE としてテキストの移動を指定しています。またドラッグされる際の処理は、DragListenerをオーバーライドすることで実装します。 //テキストをドラッグ&ドロップするデータとして扱えるようにする Transfer [] transfers = new Transfer[]{ TextTransfer.getInstance(); }; //DragSource (ドラッグされる側) list1 = new List(...); ... DragSource source = new DragSource(list1, DND.DROP_MOVE); source.setTransfer(transfers); source.addDragListener(new DragSourceListener(){ public void dragStart(DragSourceEvent e){ //ドラッグ可能な条件をクリアしたとき e.doit = true にすると //dragSetData()が呼び出される if ( list1.getSelectionCount() == 1){ e.doit = true } } public void dragSetData(DragSourceEvent e){ //Listで選択されているアイテムを取り出す int index = list1.getSelectionIndex(); e.data = list1.getItem(index); } public void dragFinished(DragSourceEvent e){ //ドラッグ&ドロップが移動の場合は、Listから選択されているアイテムを除去 int index = list1.getSelectionIndex(); list1.remove(index); } }); DropTargetも同様にリストウィジェットを使って実装すると以下のようになります。ウィジェットにドロップされたときの処理は、DropTargetListenerをオーバーライドすることで実装します。 //DropTarget(ドロップされる側) list2 = new List(...); DropTarget target = new DropTarget(list2, DND.DROP_MOVE); target.setTransfer(transfers); target.addDropListener(new DropTargetListener(){ public void drop(DropTargetEvent e){ //ドロップされたときの処理 if (e != null){ String str = (String)e.data; list2.add(str); } } ... }); サンプルプログラムDragSourceのリストからDropTargetのリストにドラッグ&ドロップすると選択されたテキストが移動します。このサンプルでは、DropTargetの領域にカーソルが入ったとき、リストの背景色を変化させています。またコントロールキーを押しながらドロップを行うとテキストがコピーされます。 ソースコード (DnDList.java)import org.eclipse.swt.widgets.*; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.layout.*; public class DnDList { private List listSource; private List listTarget; private Display display; public static void main(String[] args) { new DnDList(); } public DnDList() { display = new Display(); Shell shell = new Shell(display); shell.setText("DnDList"); shell.setLayout(new GridLayout(2, true)); new Label(shell, SWT.NONE).setText("DragSource:"); new Label(shell, SWT.NONE).setText("DropTarget:"); listSource = new List(shell, SWT.SINGLE | SWT.BORDER); listSource.setLayoutData(new GridData(GridData.FILL_BOTH)); listSource.add("アイテム1"); listSource.add("アイテム2"); listSource.add("アイテム3"); DragSource source = new DragSource(listSource, DND.DROP_MOVE | DND.DROP_COPY); source.setTransfer(new Transfer[] { TextTransfer.getInstance()}); source.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { if (listSource.getSelectionCount() == 1) { event.doit = true; } } public void dragSetData(DragSourceEvent event) { int index = listSource.getSelectionIndex(); event.data = listSource.getItem(index); } public void dragFinished(DragSourceEvent event) { int index = listSource.getSelectionIndex(); if (event.detail == DND.DROP_MOVE) { listSource.remove(index); } if (event.detail == DND.DROP_COPY) { //do nothing. } } }); listTarget = new List(shell, SWT.SINGLE | SWT.BORDER); listTarget.setLayoutData(new GridData(GridData.FILL_BOTH)); DropTarget target = new DropTarget(listTarget, DND.DROP_MOVE | DND.DROP_COPY); target.setTransfer(new Transfer[] { TextTransfer.getInstance()}); target.addDropListener(new DropTargetListener() { public void dragEnter(DropTargetEvent event) { listTarget.setBackground( display.getSystemColor(SWT.COLOR_GRAY)); } public void dragLeave(DropTargetEvent event) { listTarget.setBackground( display.getSystemColor(SWT.COLOR_WHITE)); } public void dragOperationChanged(DropTargetEvent event) { } public void dragOver(DropTargetEvent event) { } public void drop(DropTargetEvent event) { if (event == null) { return; } String item = (String) event.data; listTarget.add(item); } public void dropAccept(DropTargetEvent event) { System.out.println("ドラッグアンドドロップが完了"); } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } 最新更新日: 2004年7月14日 |
- PR -
【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!
オフィス用品・オフィス家具 価 格 交 渉 可!
|
||||
|
|||||
Copyright(C) 2003,2004 Jasmin Project. All Right Reserved. |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||