(swing读书笔记)JTree简介(中)

来源:互联网 发布:迅雷校园招聘java笔试 编辑:程序博客网 时间:2024/05/22 07:55
 

(swing读书笔记)JTree简介(中)

                                              By cszhao1980

三.TreeModel(树模型)

同JTable相比,TreeModel接口显得不那么重要。这是Tree的特殊性造成的——TreeNode实现Tree的物理结构。因此,TreeModel接口中最重要的作用就是跟踪Tree的根节点了。

方法摘要

 Object

getRoot()
          返回树的根。

 boolean

isLeaf(Object node)
          如果 node 为叶节点,则返回 true。

 void

addTreeModelListener(TreeModelListener l)
          为树更改后发布的 TreeModelEvent 添加侦听器。

 Object

getChild(Object parent, int index)
          返回父节点的子数组中索引 index 位置的 parent 的子节点。

 int

getChildCount(Object parent)
          返回 parent 的子节点数。

 int

getIndexOfChild(Object parent,Object child)
          返回父节点中子节点的索引。

 void

removeTreeModelListener(TreeModelListener l)
          移除以前通过 addTreeModelListener 添加的侦听器。

 void

valueForPathChanged(TreePath path,Object newValue)
          用户已将 path 标识的项的值更改为 newValue 时,进行通知。

 

Swing定义了DefaultTreeModel实现TreeModel接口,它还额外实现了许多方法:

 boolean

asksAllowsChildren()
告知如何确定叶节点。如果只有不允许有子节点的节点是叶节点,则返回 true,如果没有子节点的节点(即使允许)是叶节点,则返回 false

 void

setAsksAllowsChildren(boolean newValue)
 通过向 TreeNodes 询问 getAllowsChildren() 或 isLeaf(),设置是否测试无叶性。

 void

setRoot(TreeNode root)
          将根设置为 root。

 TreeNode[]

getPathToRoot(TreeNode aNode)
          向上构建节点的父节点一直到根节点(包括根节点),其中原始节点是返回数组中的最后一个元素。

protected  TreeNode[]

getPathToRoot(TreeNode aNode, int depth)
          向上构建节点的父节点一直到根节点(包括根节点),其中原始节点是返回数组中的最后一个元素。

 void

insertNodeInto(MutableTreeNode newChild,MutableTreeNode parent, int index)
          对它进行调用,以便在父节点的子节点中的 index 位置插入 newChild

 void

removeNodeFromParent(MutableTreeNode node)
          通知它从其父节点中移除节点。

 

值得一提的是TreeModelEvent,在节点更改、插入或移除时会触发此事件。

此时,Tree节点的修改已经完成:

(1)         即如果是添加的话,新添加节点已经添加好;

(2)         删除的话,已经被删除(通过该节点的getParent()无法得到父节点了,可以通过e.getPath()得到“原父节点”)

方法摘要

 Object[]

getPath()
    返回的是“已修改、添加、删除”的节点的父节点的路径。

 int[]

getChildIndices()
     返回“被修改节点”相对于其“原/新”父节点的子索引值。

 Object[]

getChildren()
     返回被修改的节点本身。

 TreePath

getTreePath()
          对于除 treeStructureChanged 以外的所有事件,返回已更改节点的父节点。

 

【注】:除了ModelStructure整个改变之外,TreeModelEvent仅支持一个节点的修改(修改、删除、添加)。

当我们选取多个节点进行操作时,其实是依次激发多个TreeModelEvent。

四.TreeSelectionModel(树选取模型)

接口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)
          将一个 PropertyChangeListener 添加到侦听器列表中。

 void

addTreeSelectionListener(TreeSelectionListener x)
          向侦听器列表添加 x,每次选定的 TreePath 集合发生更改时,这些侦听器都会得到通知。

 void

addSelectionPath(TreePath path)
          将路径添加到当前的选择中。

 void

addSelectionPaths(TreePath[] paths)
          向当前的选择中添加路径。

 int

getSelectionMode()
返回当前选择的模式(SINGLE_TREE_SELECTION、CONTIGUOUS_TREE_SELECTION 或 DISCONTIGUOUS_TREE_SELECTION 之一)。

TreePath

getSelectionPath()
          返回选择中的第一个路径。

 TreePath[]

getSelectionPaths()
          返回选择中的路径。

 void

clearSelection()
          清空当前的选择。

 TreePath

getLeadSelectionPath()
          返回添加的最后一个路径。

 

Swing提供了默认的接口实现——DefaultTreeSelectionModel。

五.JTree

5.1.JTree的构造

通常有两种方式:

(1)         通过构造TreeNode,然后使用TreeNode来构造JTree;

JTree()
          返回带有示例模型的 JTree。

JTree(TreeModel newModel)
          返回 JTree 的一个实例,它显示根节点 - 使用指定的数据模型创建树。

JTree(TreeNode root)
          返回 JTree,指定的 TreeNode 作为其根,它显示根节点。

JTree(TreeNode root, boolean asksAllowsChildren)
     返回 JTree,指定的 TreeNode 作为其根,它用指定的方式显示根节点,并确定节点是否为叶节点。

比如:

使用无参数的构造函数,然后再使用setRoot()方法设置Root TreeNode;

使用TreeNode构造TreeModel,然后,使用TreeModel构造JTree;

直接使用Root TreeNode 构造Tree。

 

(2)         使用Object[]、Vector、Hashtable直接构造

JTree(Hashtable<?,?> value)
          返回从 Hashtable 创建的 JTree,它不显示根。

JTree(Object[] value)
          返回 JTree,指定数组的每个元素作为不被显示的新根节点的子节点。

JTree(Vector<?> value)
          返回 JTree,指定 Vector 的每个元素作为不被显示的新根节点的子节点。

5.2.JTree的方法

JTree中含有大量方法,尽管很多都属于外观模式的方法——它会委托给它的各种模型来完成真正的操作。

 

很多方法都很有用,如:

  • isRootVisible()
  • setRootVisible(boolean)
  • setShowsRootHandles(boolean) 节点句柄——绘制在根节点左侧的“小钥匙”

还有些属于坐标<———>Tree转换的方法,如:

  • public TreePath getPathForLocation(int x, int y)
  • public int getRowForLocation(int x, int y)
  • public TreePath getClosestPathForLocation(int x, int y)
  • public int getClosestRowForLocation(int x, int y)

Row<———>Tree转换的方法,如:

  • public TreePath getPathForRow(int row)
原创粉丝点击