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日
 
関連リンク
Eclipse API ドキュメント
TextTransfer
DragSource
DragSourceListener
DropTarget
DropTargetListener

- PR -

プレゼンテーション作成ソフト無料お試し版配信中

【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!

オフィス用品・オフィス家具 価 格 交 渉 可! 
◎ 目指せ★業界最安値 ★ ◎ オフィネット・ドットコム株式会社

注文から納品まで驚きの早さ!!【ASKULカタログ】はこちらから・・・

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送