1 10 package mondrian.gui; 11 12 import javax.swing.*; 13 import javax.swing.event.TreeExpansionEvent ; 14 import javax.swing.event.TreeExpansionListener ; 15 import javax.swing.event.TreeSelectionEvent ; 16 import javax.swing.event.TreeSelectionListener ; 17 import javax.swing.tree.DefaultTreeModel ; 18 import javax.swing.tree.TreePath ; 19 import java.util.HashSet ; 20 import java.util.Iterator ; 21 import java.util.Set ; 22 23 30 public class JTreeUpdater implements TreeExpansionListener , TreeSelectionListener { 31 32 private JTree tree = null; 33 private Set expandedTreePaths = new HashSet (); 34 private TreePath [] selectedTreePaths = new TreePath [0]; 35 36 41 public JTreeUpdater(JTree tree) { 42 this.tree = tree; 43 this.tree.addTreeExpansionListener(this); 44 this.tree.addTreeSelectionListener(this); 45 } 46 47 50 public synchronized void update() { 51 synchronized(this.tree) { 52 this.tree.removeTreeExpansionListener(this); 53 this.tree.removeTreeSelectionListener(this); 54 55 ((DefaultTreeModel ) this.tree.getModel()).reload(); 56 Iterator keys = expandedTreePaths.iterator(); 57 while (keys.hasNext()) { 58 TreePath path = (TreePath ) keys.next(); 59 this.tree.expandPath(path); 60 } 61 this.tree.getSelectionModel().setSelectionPaths(selectedTreePaths); 62 this.tree.addTreeExpansionListener(this); 63 this.tree.addTreeSelectionListener(this); 64 } 65 } 66 67 71 public void treeExpanded(TreeExpansionEvent treeExpansionEvent) { 72 TreePath expandedPath = treeExpansionEvent.getPath(); 73 74 76 Object [] paths = expandedTreePaths.toArray(); 78 for (int i=0; i<paths.length; i++) { 79 TreePath path = (TreePath ) paths[i]; 80 81 if (path.isDescendant(expandedPath)) { 84 expandedTreePaths.remove(path); 85 } 86 } 87 expandedTreePaths.add(expandedPath); 89 90 } 92 93 97 public void treeCollapsed(TreeExpansionEvent treeExpansionEvent) { 98 TreePath collapsedPath = treeExpansionEvent.getPath(); 99 expandedTreePaths.remove(collapsedPath); 100 102 Object [] paths = expandedTreePaths.toArray(); 104 for (int i=0; i<paths.length; i++) { 105 TreePath path = (TreePath ) paths[i]; 106 107 if (collapsedPath.isDescendant(path)) { 110 expandedTreePaths.remove(path); 111 } 112 } 113 115 } 116 117 public void valueChanged(TreeSelectionEvent treeSelectionEvent) { 118 if (this.tree.getSelectionPaths() != null && this.tree.getSelectionPaths().length > 0) { 119 selectedTreePaths = this.tree.getSelectionModel().getSelectionPaths(); 120 } 121 } 122 } 123 124 | Popular Tags |