三大控件之————JTree
来源:互联网 发布:阿里云服务器闪退 编辑:程序博客网 时间:2024/06/07 10:40
public class TreePanel extends JScrollPane {
private FileSystemView fsv = FileSystemView.getFileSystemView(); //得到系统桌面文件视图
private Object[] objects = new Object[0]; //对象数组
private JTree tree;
private DefaultTreeModel model; //JTree模型
public TreePanel() { //(注:DynamicUtilTreeNode为DefaultMutableTreeNode的子类)
DynamicUtilTreeNode root = new DynamicUtilTreeNode( //model的创建需要一个TreeNode的实例参数
fsv.getHomeDirectory(), objects);
tree = new JTree(model = new DefaultTreeModel(root)); //创建JTree
tree.setCellRenderer(cellRenderer); //设置JTree渲染器
tree.addTreeWillExpandListener(willExpandListener); //设置JTree将要展开事件处理
getViewport().setView(tree);
addChildren(root);
}
private void addChildren(DynamicUtilTreeNode parent) { //传入一个TreeNode
if (parent.getChildCount() > 0) { //如果子节点数大于0,返回(说明已经展开了)
return;
}
Object value = parent.getUserObject();
if (!(value instanceof File)) { //如果节点不是文件,返回
return;
}
File[] files = ((File) value).listFiles();
for (File file : files) { //根据JTree根节点遍历下面子节点,并添加到model中
model.insertNodeInto(
new DynamicUtilTreeNode(file, file.isDirectory() ? objects
: null), parent, parent.getChildCount());
}
}
****************************************************************
//JTree将要展开事件
private TreeWillExpandListener willExpandListener = new TreeWillExpandListener() {
@Override
public void treeWillExpand(TreeExpansionEvent event) //JTree将要展开
throws ExpandVetoException {
Object value = event.getPath().getLastPathComponent(); //得到当前选中的节点对象
if (value instanceof DynamicUtilTreeNode) {
addChildren((DynamicUtilTreeNode) value); //添加根节点下面的子节点
}
}
@Override
public void treeWillCollapse(TreeExpansionEvent event)
throws ExpandVetoException {
}
};
****************************************************************
(注:一般是将渲染器器单独写成一个类)
private TreeCellRenderer cellRenderer = new DefaultTreeCellRenderer() { //JTree的渲染器
//此处也可以使用如下类加载方式加载自己想要显示的图标
private ImageIcon img = new ImageIcon(MyTreeCellRenderer.class.getResource("down.png"));
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
if (value instanceof DynamicUtilTreeNode) {
value = ((DynamicUtilTreeNode) value).getUserObject();
if (value instanceof File) {
File file = (File) value;
value = fsv.getSystemDisplayName(file); //设置当前节点对象为系统视图
Icon icon = fsv.getSystemIcon(file); //得到系统当前图标
setOpenIcon(icon); //设置节点在三中状态下的显示图标
setClosedIcon(icon);
setLeafIcon(icon);
}
}
return super.getTreeCellRendererComponent(tree, value, sel,
expanded, leaf, row, hasFocus);
}
};
}
这里需要注意:tree 为要绘制节点的树 expanded 节点是否展开或可见
value 为要绘制的节点对象 leaf 该节点为叶子节点
selected 该节点的选中状态 row 显示包含该节点的那行
hasFocus 当前选中的节点拥有输入焦点
******************************************************************************************************************
构造JTreed的常用方法是:
private DefaultMutableTreeNode node = new DefaultMutableTreeNode("name");
//先创建DefaultMutableTreeNode,TreeNode上可以随意添加子节点
可以使用add()方法添加子节点
DefaultTreeModel mode=new DefaultTreeModel(node);
//再创建DefaultTreeModel,并传入node
JTree tr=new JTree();
//最后构建JTree,并传入(mode)
操作JTree中数据的常用方法是:
mode.insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index);
//直接操作模型即可 (其他方法可以直接查JDK)
JTree的一般事件处理: (可直接用内部类实现)
public void valueChanged(TreeSelectionEvent e) { //JTree的 TreeSelectionListener事件处理
DefaultMutableTreeNode node = (DefaultMutableTreeNode)
tree.getLastSelectedPathComponent(); //得到JTree的节点对象
(注:这是最常用的得到选中节点对象的方法)
if (node == null) return;
if (node.isLeaf()) { //如果是叶子节点,
System.out.println("选中了叶子节点");
} else { //根节点
System.out.println("选中了根节点");
}
}
JTree的展开和关闭事件处理:
tree.addTreeExpansionListener(this); //JTree已经展开或关闭事件
tree.addTreeWillExpandListener(this); //JTree将要展开或关闭事件
class DemoArea extends JScrollPane //也可以用内部类方式实现
implements TreeExpansionListener,
TreeWillExpandListener { //设置JTree的将要展开事件和已经展开事件
public void treeWillExpand(TreeExpansionEvent e) { //将要展开或关闭事件函数
}
public void treeWillCollapse(TreeExpansionEvent e) {
}
public void treeExpanded(TreeExpansionEvent e) { //已经展开或关闭事件函数
}
public void treeCollapsed(TreeExpansionEvent e) {
}
}
JTree的其他一些实用方法或重点:
//设置树一次只能选择一个
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
scrollPathToVisible(TreePath path) 这个函数将展开路径中所有的节点,(添加新节点后使用)
setEditable(boolean flag) 设置可以编辑
setRootVisible(boolean rootVisible) 设置根节点是否显示
putClientProperty(key, value) 设置显示水平线条
setShowsRootHandles(newValue) 设置是否显示树的把手
- 三大控件之————JTree
- Swing之JTree——1
- Swing之JTree——2
- Swing之JTree——3
- 三大控件之————JList
- 三大控件之————JTabel
- Android自定义控件 —— 三大流程
- GUI编程——带CheckBox的JTree
- JTree实现文件树——使用系统图标
- HBase导入大数据三大方式之(三)——mapreduce+completebulkload 方式
- java三大特性之————封装
- 黑马程序员——OC三大特性之封装
- JavaWeb笔记——三大组件之监听器
- JavaWeb笔记——三大组件之过滤器
- Java 三大特性之——继承
- Java 三大特性之——继承
- 国际结算三大方式之——汇款
- Android五大存储方式之三——SharedPreferences
- Spring的StringUtils工具类
- 矩形面积和矩形周长并的模板——来自notonlysuccess
- 明年的七夕,你还记得我吗
- canvas
- 基于管道的popen和pclose函数
- 三大控件之————JTree
- httpclient 调用webservice
- ios设置导航条背景图片
- 20121010
- open与fopen的区别
- xml schema
- xml-schema约束
- 关于js中用el表达式获取值的小问题
- 企业信息化IT架构方法