树
树组件类JTree----树节点接口TreeNode-----通用节点类DefaultMutableTreeNode
1.创建树节点
DefaultMutableTreeNode() DefaultMutableTreeNode(Object userObject) DefaultMutableTreeNode(Object userObject,boolean allowsChildren)------(有子节点是否允许节点使用数据)
DefaultMutableTreeNode root; root.add(node); JTree tree = new JTree(root)
2.处理选中节点事件
2.1组件的选择模式
TreeSelectionModel model = tree.getSelectionModel(); model.setSelectionMode(int mode);
常量值–TreeSelectionModel静态常量–说明 1----SINGLE_TREE_SELECTION----------只允许选择一个 2----CONTIGUOUS_TREE_SELECTION------允许连续选中多个 4----DISCONTIGUOUS_TREE_SELECTION—允许任意选择多个(默认模式)
2.2数组件触发选择事件
TreeSelectionListener valueChanged(TreeSelectionEvent e)—当节点被选中时 TreeSelectionEvent —getSource()–JTree对象–(节点路径)TreePath paths[] = getSelectionPaths()
2.2.1TreePath常用的节点路径方法-了解
—导入的包import javax.swing.tree.TreePath;
方法 | 说明 |
---|---|
getPathComponent(int element) | 指定索引位置的节点对象 |
getLastPathComponent() | 获取路径中最后一个节点的对象 |
getPathCount() | 获取路径中包含节点的数量 |
getParentPath() | 除了最后一个节点之外,获取路径中的路径 |
pathByAddingChild(Object child)- | -将指定节点添加到路径中的路径 |
getPathComponent(int element) | 指定索引位置的节点对象 |
import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; public class Tree {
public static void main(String[] args) {
JFrame f = new JFrame();
DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
DefaultMutableTreeNode subnode1 = new DefaultMutableTreeNode("子节点1");
DefaultMutableTreeNode subnode2 = new DefaultMutableTreeNode("子节点2");
DefaultMutableTreeNode subnode11 = new DefaultMutableTreeNode("二级子节点1");
DefaultMutableTreeNode subnode12 = new DefaultMutableTreeNode("二级子节点2");
root.add(subnode1);
root.add(subnode2);
subnode1.add(subnode11);
subnode1.add(subnode12);
// JTree tree = new JTree();
JTree tree = new JTree(root);//此处的新建的树,如果没有参数的话,起就会按照默认模板,故需要把自己做得树当成参数加入进去
f.getContentPane().add(tree);
// 常量值--TreeSelectionModel静态常量--说明
// 1----SINGLE_TREE_SELECTION----------只允许选中一个
// 2----CONTIGUOUS_TREE_SELECTION------允许连续选中多个
// 4----DISCONTIGUOUS_TREE_SELECTION---允许任意选中多个(默认模式)
TreeSelectionModel model = tree.getSelectionModel();
model.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//单选
tree.addTreeSelectionListener(new TreeSelectionListener() {
//创建一个接口对象
@Override
public void valueChanged(TreeSelectionEvent e) {
JTree t = (JTree)e.getSource();//e.getSource()返回的是一个object值,故需要强制转换
if(!t.isSelectionEmpty()) {
//如果值没有空选
TreePath paths[] = t.getSelectionPaths();
for(TreePath path:paths) {
// System.out.println(path);//欲获得所有节点的名称,则需要再次遍历一下
Object obj[] = path.getPath();//返回的是object值,再次遍历
for(Object o:obj) {
System.out.print(o+" ");
}
System.out.println();//一个循环结束之后,换一下行
}
}
}
});
// valueChanged(TreeSelectionEvent e)---当节点被选中时
f.setSize(400, 300);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
3.遍历树节点
3.1四种遍历方式
- 按前序遍历
- 按后序遍历
- 以长度优先遍历
- 以深度优先遍历
4.定制树
4.1定制根节点
设置根结点是否可见----setRootVisible(boolean)
4.2定制图标效果
引用的类DefaultTreeCellRenderer—默认树单元渲染类 可通过tree.getCellRenderer()方法来获取该渲染类对象
- setLeafIcon(new icon)-------子节点图标
- setOpenIcon(new icon)-----打开图标
- setClosedIcon(new icon)-----关闭图标
DefaultTreeCellRenderer render =(DefaultTreeCellRenderer)tree.getCellRenderer();//getCellRenderer()返回的是JTree对象,故需要进行强制转
render.setLeafIcon(new ImageIcon("src/1.png"));//子节点图标
render.setOpenIcon(new ImageIcon("src/2.png"));//打开图标
render.setClosedIcon(new ImageIcon("src/3.png"));//关闭图标
4.3定制连接线效果
putClientProperty(Object key, Object value);
连接线效果共有以下三种:
tree.putClientProperty("JTree.lineStyle", "Angled");//默认效果
tree.putClientProperty("JTree.lineStyle", "Horizontal");//连接线水平
tree.putClientProperty("JTree.lineStyle", "None");//无连接线
5.维护树模型
insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index)---添加--(新节点对象,父节点对象,新节点的索引位置)
nodeChanged(TreeNode node)---修改---(修改后的节点对象)
removeNodeFromParent(MutableTreeNode node)---删除---(被删除的节点对象)
6.处理展开节点事件
方法 | 说明 |
---|---|
TreeWillExpandListener | 树节点将要被展开/折叠监听器 |
treeWillExpand(TreeExpansionEvent event) | 当节点将要被展开时 |
treeWillCollapse(TreeExpansionEvent event) | 当节点将要被折叠时 |
TreeExpandListener | 树节点已经被展开/折叠监听器 |
treeExpand(TreeExpansionEvent event)- | -当节点已经被展开时 |
treeCollapse(TreeExpansionEvent event) | 当节点已经被折叠时 |
java项目实例如下:
tree.addTreeWillExpandListener(new TreeWillExpandListener() {
@Override
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
TreePath path = event.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
System.out.println("节点["+node+"]将要被展开");
}
@Override
public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
TreePath path = event.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
System.out.println("节点["+node+"]将要被折叠");
}
});
tree.addTreeExpansionListener(new TreeExpansionListener() {
@Override
public void treeExpanded(TreeExpansionEvent event) {
TreePath path = event.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
System.out.println("节点["+node+"]已经被展开");
}
@Override
public void treeCollapsed(TreeExpansionEvent event) {
TreePath path = event.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
System.out.println("节点["+node+"]已经被折叠");
}
});