Link to home
Start Free TrialLog in
Avatar of xelia
xelia

asked on

Refreshing JTree without using DefaultTreeModel

I need to dynamically change the display information of tree nodes (e.g. node text), and then refresh the entire JTree so that my changes are displayed.

DefaultTreeModel has lots of useful methods that I could use to refresh the tree (e.g. reload()), however, there is no guarantee that the JTree will be using DefaultTreeModel.

Is there a way to refresh the tree without using DefaultTreeModel?

I am temporarily using the following code for the refresh:
    if(tree.isExpanded(rootPath)) {
      // Note the currently selected path so that it can be
      // restored after the tree is refreshed.
      TreePath selectedPath = tree.getSelectionPath();

      // Do the "refresh".
      tree.collapsePath(rootPath);
      tree.expandPath(rootPath);
      // The selection path will now be set to rootPath.

      // Restore the old selection path.
      tree.setSelectionPath(selectedPath);
    }

But this will fire unwanted TreeSelectionEvents, so I would prefer another solution.
Avatar of Mick Barry
Mick Barry
Flag of Australia image

You have to fire the relevant events from the TreeModel, this does not have to be a DefaultTreeModel, but it needs to come from the model.
Any other solution, such as refreshing the model, would cause you to lose your selection as you have already experienced.
Avatar of xelia
xelia

ASKER

Thanks objects,

I'll ask the people who created the tree model if they are firing the event when the node's data changes.
Avatar of xelia

ASKER

Unfortunately their TreeModel is not firing events when the nodes' contents changes, and I don't have access to the source code.
Avatar of xelia

ASKER

It would be nice to have a utility method to refresh any JTree, no matter what its model is doing:

public static void refreshAll(JTree tree) {
  // Do refresh here.
}
ASKER CERTIFIED SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of xelia

ASKER

This works, but like you were saying before, the selected path gets lost.  :(
yes, as the tree has no way of knowing whether the underlying model data has changed or not so it has to clear any state such as selection.
Avatar of xelia

ASKER

Thanks objects - that answered my next question (why changing the model was firing TreeSelectionEvents).