# JTree / delete node



## Johannes L. (29. Okt 2006)

Hi,

ich habe einen TreeSelectionListener dem Baum hinzugefügt:


```
tree.getSelectionModel().addTreeSelectionListener(
        new TreeSelectionListener() {
          public void valueChanged(TreeSelectionEvent e)
          {
            selected = (Long) e.getNewLeadSelectionPath()
                .getLastPathComponent();
            ...
          }
        });
```

Wenn ich nun per


```
/**
   * Delete selected node/nodes with descendants (implemented in IdefixXMLTreeModel).
   */
  public void deleteNode()
  {
    TreePath[] paths = tree.getSelectionPaths();
    
    if (paths != null)
    {
      tree.clearSelection();
      
      // foreach path in TreePath
      for (TreePath path : paths)
      {
        if (path.getPathCount() > 1)
        {
          treeModel.remove(path);
          tree.addSelectionPath(path.getParentPath());
        }
      }
    }
  }
```

wie in der FAQ und einer Implementation im TreeModel, einen Knoten löschen will, so bekomme ich eine NullPointerException bei obiger getLastPathComponent()-Methode, da der Knoten ja dann gelöscht ist.

Etwas später kommt dann noch eine weitere NullPointerException beim Zeichnen:


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.tree.DefaultTreeCellRenderer.paintFocus(DefaultTreeCellRenderer.java:434)
```

Wie umgehe ich das?

Viele Grüsse,
Johannes


----------



## André Uhres (29. Okt 2006)

Bevor du die Nodes entfernst, könntest du die Zeile vom SelectionPath in einer Variablen speichern:

```
int row = tree.getRowForPath(tree.getSelectionPath());
```
Nachdem du die Nodes entfernt hast, selektierst du einfach diese Zeile:

```
tree.setSelectionRow(row);
```
Dann ist immer eine Zeile selektiert und ich denke das Problem müsste dadurch gelöst sein.

EDIT: "tree.addSelectionPath(path.getParentPath());" denke ich muss aber auch weg


----------



## Johannes L. (29. Okt 2006)

Du meinst folgende Methode, oder?


```
public void deleteNode()
  {
    TreePath[] paths = tree.getSelectionPaths();
    
    if (paths != null)
    {
      int row = tree.getRowForPath(tree.getSelectionPath());
      
      tree.clearSelection();
      
      // foreach path in TreePath
      for (TreePath path : paths)
      {
        if (path.getPathCount() > 1)
          treeModel.remove(path);
      }
      
      tree.setSelectionRow(row);
    }
  }
```

Leider wirft sie auch die zwei Nullpointer Exceptions, aber prinzipiell müsste dann doch wirklich immer etwas selektiert sein, zumindest wenn ich tree.setSelectionRow(row); for der for-Schleife setze :-/

Wahrscheinlich müsste es dann auch row - 1 sein, da sonst sicher auch eine NullPointer Exception auftreten würde, wenn ich das allerletzte Blatt im Baum löschen will, aber klappt leider eh noch nicht.

EDIT: Ach, tree.clearSelection(); sollte man natürlich weglassen, scheint soweit zu klappen, wobei ich die remove-Methode im TreeModel noch nicht ganz fertig habe ;-)


----------

