XmlTree mit Drag n' Drop

Loki2

Erfahrenes Mitglied
Hallo

Ich benutze in meinem Programm XmlBeans von Apache und den XmlTree. Siehe Sample hier.


Soweit funktioniert auch alles sehr gut allerdings schaffe ich es einfach nicht den XmlTree um eine Drag and Drop Funktionalität zu erweitern :-(

Kann mir da vielleicht jemand behilflich sein? Ich komme einfach nicht weiter. Das "drag" funktioniert schon aber "drop" funktioniert leider nicht und ich habe keine Idee wie ich das am besten hinbekomme :(

Der Xmltree ist ja leider kein Standard JTree deswegen müsste die normale Drag n' Drop Funktion etwas angepasst werden, leider komme ich damit nicht weiter.

Hier mal ein paar Code-Schnipsel was ich bisher so habe.

Code:
    public void initXmlTree(File xmlFile) {
        if (xmlFile == null){
            //return jTree;
        } else {
            final XmlTree buildTree = new XmlTree(xmlFile);
            
            buildTree.setDragEnabled(true);
            setDropTarget(new DropTarget(buildTree, new DropTargetListener() {
                private DefaultMutableTreeNode getNodeForEvent(DropTargetDragEvent dtde) {
                    Point p = dtde.getLocation();
                    TreePath path = getJTree().getClosestPathForLocation(p.x, p.y);
                    return(DefaultMutableTreeNode) path.getLastPathComponent();
                    }

                    public void dragOver(DropTargetDragEvent dtde) {
                        DefaultMutableTreeNode source =
                        (DefaultMutableTreeNode) getJTree().getSelectionPath().getLastPathComponent();
                        XmlEntry node = (XmlEntry)getNodeForEvent(dtde);
                        
                        node.setParent((MutableTreeNode) getJTree().getModel().getRoot());
                        
    //                  Nur dann akzeptieren, wenn der parent des Zielknotens
    //                  der gleiche ist, wie der des verschobenen Knotens,
    //                  oder man auf das parent des verschobenen Knotens zeigt
                        
                        if((node.getParent() != null && node.getParent() == source.getParent()) ||
                        node == source.getParent()) {
                            dtde.acceptDrag(dtde.getDropAction());
                        }else {
                            dtde.rejectDrag();
                        }
                    }

                    public void drop(DropTargetDropEvent dtde) {
                        DefaultMutableTreeNode source =
                        (DefaultMutableTreeNode) getJTree().getSelectionPath().getLastPathComponent();
                        Point p = dtde.getLocation();
                        TreePath path = getJTree().getClosestPathForLocation(p.x, p.y);
                        DefaultMutableTreeNode target = (DefaultMutableTreeNode)path.getLastPathComponent();
                        DefaultMutableTreeNode parent = (DefaultMutableTreeNode)source.getParent();
    
    //                  Verschobenen Knoten entfernen
                        XmlModel dtm = (XmlModel)getJTree().getModel();
                        dtm.removeNodeFromParent(source);
    
    //                  Verschobenen Knoten hinter dem Zielknoten einfügen
                        int targetIndex = 0;
                        if (target != parent) {
                            targetIndex = parent.getIndex(target) + 1;
                        }
                        System.out.println("insert "+source+" at "+targetIndex);
                        dtm.insertNodeInto(source, parent, targetIndex);
                        getJTree().setModel(dtm);
                        getJScrollPane().setViewportView(getJTree());
                    }

                    public void dragEnter(DropTargetDragEvent dtde)
                    {}

                    public void dragExit(DropTargetEvent dte)
                    {}

                    public void dropActionChanged(DropTargetDragEvent dtde)
                    {}
            }));
     }
Code:
    public void removeNodeFromParent(MutableTreeNode node) {
        MutableTreeNode         parent = (MutableTreeNode)node.getParent();

        if(parent == null)
            throw new IllegalArgumentException("node does not have a parent.");

        int[]            childIndex = new int[1];
        Object[]         removedArray = new Object[1];

        childIndex[0] = parent.getIndex(node);
        parent.remove(childIndex[0]);
        removedArray[0] = node;
        nodesWereRemoved(parent, childIndex, removedArray);
    }

Ich hoffe ihr könnt mir weiterhelfen und wünsche noch frohe Ostern!!

Gruß und so
Loki2
 
Zurück