jtreeupdater.java

来自「数据仓库展示程序」· Java 代码 · 共 80 行

JAVA
80
字号
package mondrian.gui;

import javax.swing.*;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Helper to enable update the tree and keep expanded nodes expanded after reloading the tree
 *
 * @author erik
 *
 */
public class JTreeUpdater implements TreeExpansionListener, TreeSelectionListener
{

    private JTree tree = null;
    private Set expandedTreePaths = new HashSet();
    private TreePath[] selectedTreePaths = new TreePath[0];

    /**
     * Constructor
     *
     * @param tree The tree to track
     */
    public JTreeUpdater(JTree tree)
    {
        this.tree = tree;
        this.tree.addTreeExpansionListener(this);
        this.tree.addTreeSelectionListener(this);
    }

    /**
     * Call this method whenever you update the tree and needs it reloaded
     */
    public synchronized void update()
    {
        synchronized(this.tree)
        {
            this.tree.removeTreeExpansionListener(this);
            this.tree.removeTreeSelectionListener(this);

            ((DefaultTreeModel) this.tree.getModel()).reload();
            Iterator keys = expandedTreePaths.iterator();
            while (keys.hasNext())
            {
                TreePath path = (TreePath) keys.next();
                this.tree.expandPath(path);
            }
            this.tree.getSelectionModel().setSelectionPaths(selectedTreePaths);
            this.tree.addTreeExpansionListener(this);
            this.tree.addTreeSelectionListener(this);
        }
    }

    public void treeExpanded(TreeExpansionEvent treeExpansionEvent)
    {
        expandedTreePaths.add(treeExpansionEvent.getPath());
    }

    public void treeCollapsed(TreeExpansionEvent treeExpansionEvent)
    {
        expandedTreePaths.remove(treeExpansionEvent.getPath());
    }

    public void valueChanged(TreeSelectionEvent treeSelectionEvent)
    {
        if (this.tree.getSelectionPaths() != null && this.tree.getSelectionPaths().length > 0)
        {
            selectedTreePaths = this.tree.getSelectionModel().getSelectionPaths();
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?