mehrere DropTargets

Baste

Mitglied
Hi Leute,

ich habe eine Klasse für einen Drag&Drop Tree geschrieben. Quelle ist der JTree und Ziel ist eine JList (nur diese eine). Gibt es irgendwie eine Möglichkeit dem JTree mehrere Ziele zuzuordnen --> sprich ich möchte die Objekte in mehrere JLists ziehen (dabei soll aber auch nur die Liste befüllt werden, welche "angesprochen" wird). Hier mal mein Code...

Code:
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.util.Vector;

import javax.swing.DropMode;
import javax.swing.JList;
import javax.swing.JTree;
import javax.swing.tree.TreeSelectionModel;

/**
* <p>Überschrift: Drag&Drop - Tree</p>
* <p>Beschreibung: JTree mit Drag&Drop-Funktion (z.B. in eine JList)</p>
* <p>Copyright: Copyright (c) 2008</p>
* @version 1.0
*/


public class DragAndDropTree extends JTree implements DragGestureListener,
      DragSourceListener, DropTargetListener {

   /**Baum*/
   JTree tree;
   
   /**zugehörige Liste*/
   JList list;

   /**Vektor enthält Wert*/
   public Vector vecList = new Vector();
   
   /**Vector enthält Positionen der "bewegten" Elemente aus Baum*/
   public Vector treePositions = new Vector();
   
   /**Array benötigt für "treePositions"*/
   int[] singleTreePosition;

   /**Ziel*/
   DropTarget mytarget;

   /**Quelle*/
   DragSource mysource;

   DragGestureRecognizer dgr;

   /**
    *
    * @param list
    */
   public DragAndDropTree(JList list, Vector treePositions) {
      
      tree = this;
      this.list = list;
      this.treePositions = treePositions;

      // Eigenschaften des Baumes
      tree.getSelectionModel().setSelectionMode(
            TreeSelectionModel.SINGLE_TREE_SELECTION);
      tree.setDropMode(DropMode.USE_SELECTION);
      tree.setDragEnabled(true);

      setDrag_n_Drop(list);
   }

   /**
    * definiert Ziel und Quelle
    *
    * @param list
    */
   void setDrag_n_Drop(JList list) {
      // Algemeines Object
      mysource = new DragSource();

      // Ziel definiert
      mytarget = new DropTarget(list, DnDConstants.ACTION_COPY_OR_MOVE, this);

      // DragGestureRecognizer dgr
      // Definiert Drag-Source
      dgr = mysource.createDefaultDragGestureRecognizer(tree,
            DnDConstants.ACTION_COPY_OR_MOVE, this);

   }

   public void dragGestureRecognized(DragGestureEvent dge) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dragDropEnd(DragSourceDropEvent dsde) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dragEnter(DragSourceDragEvent dsde) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dragExit(DragSourceEvent dse) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dragOver(DragSourceDragEvent dsde) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dropActionChanged(DragSourceDragEvent dsde) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dragEnter(DropTargetDragEvent dtde) {
      // TODO Automatisch erstellter Methoden-Stub
      dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
   }

   public void dragExit(DropTargetEvent dte) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   public void dragOver(DropTargetDragEvent dtde) {
      // TODO Automatisch erstellter Methoden-Stub

   }

   /**
    * String bearbeiten und der Liste hinzufügen
    */
   public void drop(DropTargetDropEvent dtde) {
      try {
         if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
            Transferable tr = dtde.getTransferable();
            dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            String sel = (String) tr
                  .getTransferData(DataFlavor.stringFlavor);
            // Vector füllen
            vecList.addElement(sel);
            //auf Liste darstellen
            list.setListData(vecList);
            dtde.dropComplete(true);
            // Positionen speichern
             singleTreePosition = tree.getSelectionRows();
             for (int v = 0; v < singleTreePosition.length; v ++) {
                treePositions.addElement(singleTreePosition[v]);
             }
            
         } else {
            dtde.rejectDrop();
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }

   }

   public void dropActionChanged(DropTargetDragEvent dtde) {
      // TODO Automatisch erstellter Methoden-Stub

   }
}

Danke!
 
Hallo,

das ganze ist möglich, aber nicht wie du es gemacht hast.

Ich kann es dir im moment nicht ganz genau sagen, wie es funktioniert. Aber grob kann ich es erklären.

Dem addest du alles was mit Drag(Listener) zu tun hat, aber nicht das DropTarget. Du willst ja nicht in den Baum droppen.

Der Liste addest du das DropTarget und die dem entsprechenden Listener. Dort definierst du dann auch was passieren soll, wenn irgendwas in der Liste gedroppt wird.

Wenn du das so machst, ist alles unabhängig voneinander. So kannst du alles als Ziel für den Baum definieren.

Ich hätte dir mal ein Beispiel fertig gemacht, aber ich habe im Moment nicht sehr viel Zeit.

MFG

zEriX
 
Hab erst mal vielen Dank, ich werde mir diese Herangehensweise mal durch den Kopf gehen lassen und testen. Aber wenn du mal bisschen Zeit übrig hast, kannst ja mal was basteln, wäre sehr dankbar darüber ;)
 
Erstmal Pushposts sind verboten, ich würde dich bitten dies zu beherzigen und eine Idee hab ich dir doch gepostet.

MFG

zEriX
 
Problem is gelöst/behoben. Ziele festlegen und über das DropTargetDropEvent die "anzusprechende" Liste zurückgeben lassen...

Code:
mytarget1 = new DropTarget(list1, DnDConstants.ACTION_COPY_OR_MOVE, this);

mytarget2 = new DropTarget(list2, DnDConstants.ACTION_COPY_OR_MOVE,this);

list = (JList) dtde.getDropTargetContext().getComponent();
 
Zurück