TreeModel (Java SE 23 & JDK 23)
Description: declaration: module: java.desktop, package: javax.swing.tree, interface: TreeModel
Keywords: javax.swing.tree.TreeModel interface

# Interface TreeModel

All Known Implementing Classes:
  `DefaultTreeModel`

public interface TreeModel
The model used by `JTree`.

`JTree` and its related classes make extensive use of `TreePath`s for identifying nodes in the `TreeModel`. If a `TreeModel` returns the same object, as compared by `equals`, at two different indices under the same parent then the resulting `TreePath` objects will be considered equal as well. Some implementations may assume that if two `TreePath`s are equal, they identify the same node. If this condition is not met, painting problems and other oddities may result. In other words, if `getChild` for a given parent returns the same Object (as determined by `equals`) problems may result, and it is recommended you avoid doing this.

Similarly `JTree` and its related classes place `TreePath`s in `Map`s. As such if a node is requested twice, the return values must be equal (using the `equals` method) and have the same `hashCode`.

For further information on tree models, including an example of a custom implementation, see How to Use Trees in The Java Tutorial.

See Also:
  - `TreePath`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addTreeModelListener(TreeModelListener l)`
  Adds a listener for the `TreeModelEvent` posted after the tree changes.
  `Object`
  `getChild(Object parent, int index)`
  Returns the child of `parent` at index `index` in the parent's child array.
  `int`
  `getChildCount(Object parent)`
  Returns the number of children of `parent`.
  `int`
  `getIndexOfChild(Object parent, Object child)`
  Returns the index of child in parent.
  `Object`
  `getRoot()`
  Returns the root of the tree.
  `boolean`
  `isLeaf(Object node)`
  Returns `true` if `node` is a leaf.
  `void`
  `removeTreeModelListener(TreeModelListener l)`
  Removes a listener previously added with `addTreeModelListener`.
  `void`
  `valueForPathChanged(TreePath path, Object newValue)`
  Messaged when the user has altered the value for the item identified by `path` to `newValue`.

- ## Method Details

  - ### getRoot

    Object getRoot()
    Returns the root of the tree. Returns `null` only if the tree has no nodes.
    Returns:
      the root of the tree

  - ### getChild

    Object getChild(Object parent, int index)
    Returns the child of `parent` at index `index` in the parent's child array. `parent` must be a node previously obtained from this data source. This should not return `null` if `index` is a valid index for `parent` (that is `index >= 0 && index < getChildCount(parent`)).
    Parameters:
      `parent` - a node in the tree, obtained from this data source
      `index` - index of child to be returned
    Returns:
      the child of `parent` at index `index`

  - ### getChildCount

    int getChildCount(Object parent)
    Returns the number of children of `parent`. Returns 0 if the node is a leaf or if it has no children. `parent` must be a node previously obtained from this data source.
    Parameters:
      `parent` - a node in the tree, obtained from this data source
    Returns:
      the number of children of the node `parent`

  - ### isLeaf

    boolean isLeaf(Object node)
    Returns `true` if `node` is a leaf. It is possible for this method to return `false` even if `node` has no children. A directory in a filesystem, for example, may contain no files; the node representing the directory is not a leaf, but it also has no children.
    Parameters:
      `node` - a node in the tree, obtained from this data source
    Returns:
      true if `node` is a leaf

  - ### valueForPathChanged

    void valueForPathChanged(TreePath path, Object newValue)
    Messaged when the user has altered the value for the item identified by `path` to `newValue`. If `newValue` signifies a truly new value the model should post a `treeNodesChanged` event.
    Parameters:
      `path` - path to the node that the user has altered
      `newValue` - the new value from the TreeCellEditor

  - ### getIndexOfChild

    int getIndexOfChild(Object parent, Object child)
    Returns the index of child in parent. If either `parent` or `child` is `null`, returns -1. If either `parent` or `child` don't belong to this tree model, returns -1.
    Parameters:
      `parent` - a node in the tree, obtained from this data source
      `child` - the node we are interested in
    Returns:
      the index of the child in the parent, or -1 if either `child` or `parent` are `null` or don't belong to this tree model

  - ### addTreeModelListener

    void addTreeModelListener(TreeModelListener l)
    Adds a listener for the `TreeModelEvent` posted after the tree changes.
    Parameters:
      `l` - the listener to add
    See Also:
      - `removeTreeModelListener(javax.swing.event.TreeModelListener)`

  - ### removeTreeModelListener

    void removeTreeModelListener(TreeModelListener l)
    Removes a listener previously added with `addTreeModelListener`.
    Parameters:
      `l` - the listener to remove
    See Also:
      - `addTreeModelListener(javax.swing.event.TreeModelListener)`