# JTree - Reihenfolge der Nodes verändern



## BRT006 (13. Okt 2005)

Hallo zusammen.

Wie kann ich die Reihenfolge von Nodes auf einer Hierarchiestufe verändern? Mal am Beispiel erklärt:

Vorher:

Wurzel
 |
 - A
 - B
 - C

Das C soll nach oben verschoben werden, also Nachher:


Wurzel
 |
 - A
 - C
 - B



Wie geh ich da vor, ich habe keine Idee.

Thx,

BRT006


----------



## AlArenal (13. Okt 2005)

Mit einer doppelt verketteten Liste. Jeder Node hält eine Referenz auf seinen Vorgänger und seinen Nachfolger. Der erste Node hat als Vorgänger null, der letze hat als Nachfolger null.

In deinem TreeModel erfordern public Object getChild(Object parent, int index) und public int getIndexOfChild(Object parent, Object child) dann etwas Gehirnschmalz (aber auch nicht soo viel). Für getChild(...) musst du den ersten Node suchen (desse Vorgänger null ist) und von ihm ausgehend holst du dann immer den Nachfolger und zählst dabei von 0 an mit, bis dein Zähler == index ist. 
getIndexOfChild() macht im Grunde dasselbe.

Ob du diese doppelt verkettete Liste zentral in einer Map ablegst, oder jeden Node Vorgänger und Nachfolger aufnehmen lässt, ist ein wenig Geschmacksfrage. Um einen Node zu verschieben, zu löschen, oder einzufügen, musst du dann entsprechend die Vorgänger und Nachfolger in der richtigen Reihenfolge ändern.

Am besten zeichneste dir mal nen kleinen Baum auf und überlegst dir die Schritte in Ruhe.


----------



## Mag1c (13. Okt 2005)

Hi,

benutzt du DefaultMutableTreeNodes ? Wenn ja, dann

1. remove(MutableTreeNode aChild) und insert(MutableTreeNode newChild, int childIndex)

oder

2. du tauschst einfach die UserObjects aus (getUserObject() und setUserObject(Object userObject))

Gruß
Mag1c


----------



## André Uhres (16. Okt 2005)

```
...
        move(UP);
    ...
    
        move(DOWN);
    ...
    private final int UP = 1;
    private final int DOWN = -1;
    private void move(final int direction){
        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
        MutableTreeNode moveNode = (MutableTreeNode) tree.getLastSelectedPathComponent();
        if(moveNode == null) return ;
        MutableTreeNode parent = (MutableTreeNode) moveNode.getParent();
        if(parent == null) return ;
        int targetIndex = model.getIndexOfChild(parent, moveNode) + direction;
        if(targetIndex < 0 || targetIndex >= parent.getChildCount()) return;
        model.removeNodeFromParent(moveNode);
        model.insertNodeInto(moveNode, parent, targetIndex);
        //make the node visible by scroll to it
        TreeNode[] nodes = model.getPathToRoot(moveNode);
        TreePath path = new TreePath(nodes);
        tree.scrollPathToVisible(path);
        //select the newly added node
        tree.setSelectionPath(path);
    }
```


----------

