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);
}
}
}
}