• JTree 常用方法


    package com.swing.demo;
    
    import java.awt.Component;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.SwingUtilities;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeSelectionModel;
    
    import com.swing.model.User;
    
    /**
     * JTree 常用方法.
     * @author Administrator
     *
     */
    public class TreeDemo {
        public static void main(String[] args) {
            final JTree tree = createTree();
            // 窗体设置
            JFrame frame = new JFrame("JTreeDemo");
            // 构造完树之后还要把树放在JScollPanel上,否则树显示会有问题
            JScrollPane treeView = new JScrollPane(tree);
            frame.add(treeView);
            frame.setSize(300, 300);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 添加树节点选择事件
            tree.addTreeSelectionListener(new TreeSelectionListener() {
    
                @Override
                public void valueChanged(TreeSelectionEvent e) {
                    // 取得TreePath
                    // TreePath newPath = event.getNewLeadSelectionPath();
                    // TreePath oldPath = event.getOldLeadSelectionPath();
                    // 通过JTree取得Node
                    // JTree tree = (JTree) event.getSource();
                    // tree.getLastSelectedPathComponent();
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
                            .getLastSelectedPathComponent();
                    if (node == null) {
                        return;
                    }
    
                    Object object = node.getUserObject();
                    if (node.isLeaf()) {
                        User user = (User) object;
                        System.out.println("你选择了:" + user.toString());
                    }
    
                    // 取得根节点:
                    TreeNode rootNode = (TreeNode) tree.getModel().getRoot();
                    // 取得树的数据模型:
                    DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
                    // 取得树的某一个节点的位置:
                    TreePath nodePath = new TreePath(treeModel.getPathToRoot(node));
                    // 设置节点的展开选择和可见性:
                    tree.setSelectionPath(nodePath);
                    tree.makeVisible(nodePath);
                    // 展开后滚动至节点可见:
                    tree.scrollPathToVisible(nodePath);
                    // 还有一个是设置鼠标点击展开树节点的(默认是双击,改成了0就是不可点击):
                    tree.setToggleClickCount(1);
                    // 另外就是一个设置Cell的高度的,但这个方法我们一般不用,大多时候是在Renderer里设置的,因为这样设置可能有UI问题:
                    // tree.setRowHeight(15);
                }
    
            });
            // 树节点展开(折叠) 事件
            tree.addTreeExpansionListener(new TreeExpansionListener() {
                @Override
                public void treeExpanded(TreeExpansionEvent event) {
                }
    
                @Override
                public void treeCollapsed(TreeExpansionEvent event) {
                }
    
            });
    
            tree.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (SwingUtilities.isLeftMouseButton(e)
                            && e.getClickCount() == 1) {
                        // Returns the last path component
                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
                                .getLastSelectedPathComponent();
                    } else if (SwingUtilities.isRightMouseButton(e)) {
                        // Returns the row for the specified location.
                        // int selectRow = tree.getRowForLocation(e.getX(),
                        // e.getY());
                        // Returns the path for the node at the specified location.
                        TreePath selectPath = tree.getPathForLocation(e.getX(),
                                e.getY());
                        if (selectPath != null) {
                            // set select
                            tree.setSelectionPath(selectPath);
                            // get tree node.
                            DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) selectPath
                                    .getLastPathComponent();
                        }
                    }
                }
            });
    
            // 渲染器
            tree.setCellRenderer(new DefaultTreeCellRenderer() {
                /**
                 * serialVersionUID
                 */
                private static final long serialVersionUID = 1L;
    
                @Override
                public Component getTreeCellRendererComponent(JTree tree,
                        Object value, boolean sel, boolean expanded, boolean leaf,
                        int row, boolean hasFocus) {
                    return super.getTreeCellRendererComponent(tree, value, sel,
                            expanded, leaf, row, hasFocus);
                }
            });
        }
    
        /**
         * createTree
         * 
         * @return
         */
        private static JTree createTree() {
            // 创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。
            // public DefaultMutableTreeNode(Object userObject)
            DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部");
            node1.add(new DefaultMutableTreeNode(new User("小花")));
            node1.add(new DefaultMutableTreeNode(new User("小虎")));
            node1.add(new DefaultMutableTreeNode(new User("小龙")));
    
            DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部");
            node2.add(new DefaultMutableTreeNode(new User("小叶")));
            node2.add(new DefaultMutableTreeNode(new User("小雯")));
            node2.add(new DefaultMutableTreeNode(new User("小夏")));
    
            DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理");
            top.add(new DefaultMutableTreeNode(new User("总经理")));
            top.add(node1);
            top.add(node2);
            // JTree(TreeNode root)
            // 返回 JTree,指定的 TreeNode 作为其根,它显示根节点。
            JTree tree = new JTree(top);
            // 最终JTree也是通过setModel设置数据的:
            // tree = new JTree();
            // tree.setModel(treeModel);
            tree.getSelectionModel().setSelectionMode(
                    TreeSelectionModel.SINGLE_TREE_SELECTION);
            return tree;
        }
    
        private List<TreeNode> treeNodeList = new ArrayList<TreeNode>();
    
        /**
         * 从任何节点递归其下所有的例子.
         * 
         * @param treeNode
         */
        public void getChildNodeList(TreeNode treeNode) {
    
            if (treeNode == null) {
                throw new RuntimeException("error treenode.");
            }
    
            if (treeNodeList == null) {
                treeNodeList = new ArrayList<TreeNode>();
            }
    
            if (treeNode.getChildCount() >= 0) {
                for (Enumeration<TreeNode> e = treeNode.children(); e
                        .hasMoreElements();) {
                    TreeNode childNode = (TreeNode) e.nextElement();
                    treeNodeList.add(childNode);
                    getChildNodeList(childNode);
                }
            }
        }
    }
  • 相关阅读:
    Android——另外一种增删查改的方式(ContentProvider常用)
    VS2012下基于Glut OpenGL glScissor示例程序:
    JAXP的SAX解析
    38岁老男孩个人建站方向求教
    [置顶] 某大型银行深化系统技术方案之十三:服务层之服务接口模式
    比特币人必知术语
    ok6410 u-boot-2012.04.01移植二修改源码支持单板
    最近修bug的一点感悟
    小智慧24
    redis beforesleep
  • 原文地址:https://www.cnblogs.com/freshier/p/4614813.html
Copyright © 2020-2023  润新知