[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00370] JTree のノード間のドラッグ&ドロップ





ひろと言います

JTree で構築したツリーモデルのノード間における
ドラッグ&ドロップを実装したいとコードを書いているのですが、
イマイチ掴みきれていないので教えてください。

まず、JTree を extends したクラスには、このようにリスナーを implements し
ドラッグソースの設定はコンストラクタでこのように設定しています。 

/**
 * ベースツリー
 */
public class YMTree extends JTree implements DropTargetListener,
DragSourceListener, DragGestureListener {
    private DefaultTreeModel m_TreeModel;
    private boolean          m_DragDrop;

    /**
     * デフォルトコンストラクタ
     */
    YMTree() {
        m_DragDrop = false;

        setEditable(true);

        DragSource dragsource = DragSource.getDefaultDragSource();
        dragsource.createDefaultDragGestureRecognizer(this,
DnDConstants.ACTION_COPY_OR_MOVE, this);

        this.addMouseMotionListener(new TreeNodeDragDropListener());
    }

・・・以下略・・・

さらに、コンストラクタではマウスのモーションリスナーも設定しています。
this.addMouseMotionListener(new TreeNodeDragDropListener());
これでドラッグ状態であれば座標値に応じてフォーカスを変更しようとするためです。

    class TreeNodeDragDropListener implements MouseMotionListener {
        public void mouseDragged(MouseEvent e) {
            System.out.println("TreeNodeDragDropListener.mouseDragged()");
        }

        public void mouseMoved(MouseEvent e) {
            System.out.println("TreeNodeDragDropListener.mouseMoved()");
            if(m_DragDrop == true) {
                // ドラッグドロップ状態の時には座標に近いノードにフォーカスを当てる
                TreePath path = getClosestPathForLocation(e.getX(),
e.getY());
                setSelectionPath(path);

                System.out.println("x = " + e.getX() + " y = " + e.getY());
            }
        }
    }

このようにやってみたのですが、
実行してみたところ

    /**
     * ドラッグ開始検出ハンドラ( DragGestureListener )
     */
    public void dragGestureRecognized(DragGestureEvent event) {
        System.out.println("YMTree.dragGestureRecognized()");

        TreePath     TP           = this.getSelectionPath();
        YMTreeNode   parentNode   = (YMTreeNode)TP.getLastPathComponent();
        Transferable transferable = new
YMTreeNodeListTransferable(parentNode);

        event.startDrag(null, transferable, this);
        m_DragDrop = true;
    }

このイベントは来るものの、
dragOver など他のメゾッドが走らないために、
ドラッグ&ドロップ状態が実行されません。
その間、MouseMotionListener も走らないですし・・・
お解りの方が居られれば教えてください。

それでは





_______________________________________________________



------------------------------------------------------------------------
   ◆ダイエットの味方カプサイシン、何のことだか説明できる?
   http://www.infoseek.co.jp/GHome?pg=gn_top.html&svx=971122