By cszhao1980
同JTable相比,TreeModel接口显得不那么重要。这是Tree的特殊性造成的——TreeNode实现Tree的物理结构。因此,TreeModel接口中最重要的作用就是跟踪Tree的根节点了。
方法摘要 |
|
Object |
getRoot() |
boolean |
isLeaf(Object node) |
void |
addTreeModelListener(TreeModelListener l) |
Object |
getChild(Object parent, int index) |
int |
getChildCount(Object parent) |
int |
getIndexOfChild(Object parent,Object child) |
void |
removeTreeModelListener(TreeModelListener l) |
void |
valueForPathChanged(TreePath path,Object newValue) |
Swing定义了DefaultTreeModel实现TreeModel接口,它还额外实现了许多方法:
boolean |
asksAllowsChildren() |
void |
setAsksAllowsChildren(boolean newValue) |
void |
setRoot(TreeNode root) |
TreeNode[] |
getPathToRoot(TreeNode aNode) |
protected TreeNode[] |
getPathToRoot(TreeNode aNode, int depth) |
|
insertNodeInto |
|
removeNodeFromParent |
值得一提的是TreeModelEvent,在节点更改、插入或移除时会触发此事件。
此时,Tree节点的修改已经完成:
(1) 即如果是添加的话,新添加节点已经添加好;
(2) 删除的话,已经被删除(通过该节点的getParent()无法得到父节点了,可以通过e.getPath()得到“原父节点”)
方法摘要 |
|
Object[] |
getPath() |
int[] |
getChildIndices() |
Object[] |
getChildren() |
TreePath |
getTreePath() |
【注】:除了ModelStructure整个改变之外,TreeModelEvent仅支持一个节点的修改(修改、删除、添加)。
当我们选取多个节点进行操作时,其实是依次激发多个TreeModelEvent。
接口TreeSelectionModel的JAVA help描述如下:
此接口表示树选择组件的当前状态。有关使用树选择模型的信息和示例,请参阅 The Java Tutorial 中的How to Use Trees 一节。 树选择的状态由 TreePath 集合描述,也可以是整数集合。从 TreePath 到整数的映射通过 RowMapper 实例的方式完成。TreeSelectionModel 不一定具有 RowMapper 才可以正确地操作,但是,没有 RowMapper 的情况下,getSelectionRows 将返回 null。 可以将 TreeSelectionModel 配置为只允许一条路径 (SINGLE_TREE_SELECTION)、多条连续路径 (CONTIGUOUS_TREE_SELECTION) 或多条不连续的路径 (DISCONTIGUOUS_TREE_SELECTION)。RowMapper 用于确定 TreePath 是否为连续。没有 RowMapper 时,CONTIGUOUS_TREE_SELECTION 和 DISCONTIGUOUS_TREE_SELECTION 的功能相同,即都允许在 TreeSelectionModel 中包含任何数量的路径。 对于 CONTIGUOUS_TREE_SELECTION 选择模型,路径在任何时候更改时(通过 setSelectionPath、addSelectionPath ...),都将重新检查 TreePath,以使它们保持连续。通过调用 resetRowSelection,也可以强制检查 TreePath。如何将一组不连续的 TreePath 映射到连续集合要通过此实例的实现者强制执行特定的策略来完成。 实现应对添加到该选择中的重复 TreePath 进行组合。例如,以下代码 TreePath[] paths = new TreePath[] { treePath, treePath }; treeSelectionModel.setSelectionPaths(paths);
会导致仅选择一个路径:treePath,而不是 treePath 的两个副本。 前导 TreePath 是添加(或设置)的最后一个路径。前导行则是对应于 TreePath 的行,由 RowMapper 确定。 |
重要的方法有:
void |
addPropertyChangeListener(PropertyChangeListener listener) |
void |
addTreeSelectionListener(TreeSelectionListener x) |
void |
addSelectionPath(TreePath path) |
void |
addSelectionPaths(TreePath[] paths) |
int |
getSelectionMode() |
TreePath |
getSelectionPath() |
TreePath[] |
getSelectionPaths() |
void |
clearSelection() |
TreePath |
getLeadSelectionPath() |
Swing提供了默认的接口实现——DefaultTreeSelectionModel。
通常有两种方式:
(1) 通过构造TreeNode,然后使用TreeNode来构造JTree;
JTree() |
JTree(TreeModel newModel) |
JTree(TreeNode root) |
JTree(TreeNode root, boolean asksAllowsChildren) |
比如:
使用无参数的构造函数,然后再使用setRoot()方法设置Root TreeNode;
使用TreeNode构造TreeModel,然后,使用TreeModel构造JTree;
直接使用Root TreeNode 构造Tree。
(2) 使用Object[]、Vector、Hashtable直接构造
JTree(Hashtable<?,?> value) |
JTree(Object[] value) |
JTree(Vector<?> value) |
JTree中含有大量方法,尽管很多都属于外观模式的方法——它会委托给它的各种模型来完成真正的操作。
很多方法都很有用,如:
还有些属于坐标<———>Tree转换的方法,如:
Row<———>Tree转换的方法,如: