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

本文是关于Swing中的JTree组件的详细笔记,涵盖了TreeCellRenderer的使用,如何自定义渲染器,TreeCellEditor的实现,以及树事件的处理,包括TreeSelectionEvent和TreeExpansionEvent。默认的渲染器DefaultTreeCellRenderer提供了丰富的定制选项,而DefaultTreeCellEditor则解决了编辑时保持图标的显示问题。文章还讨论了事件监听和处理,如编辑结束时的ChangeEvent和节点展开折叠时的TreeExpansionEvent。
摘要由CSDN通过智能技术生成
 

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

                                              By cszhao1980

六.TreeCellRenderer

通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法:

 

 Component

getTreeCellRendererComponent(JTree tree,Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
 当前树单元格的值为value。

 

Swing提供了一个缺省的绘制器——DefaultTreeCellRenderer。它继承自JLabel,提供了一系列方法供改变外观,如:

 Font

getFont()
          获取此组件的字体。

 Icon

getLeafIcon()
          返回用于表示叶节点的图标。

 Icon

getOpenIcon()
          返回用于表示扩展的非叶节点的图标。

Icon

getClosedIcon()
          返回用于表示没有扩展的非叶节点的图标。

 void

setClosedIcon(Icon newIcon)
          设置用于表示没有扩展的非叶节点的图标。

 void

setFont(Font font)
          创建子类,以便将 FontUIResource 映射为 null。

 void

setLeafIcon(Icon newIcon)
          设置用于表示叶节点的图标。

 void

setOpenIcon(Icon newIcon)
          设置用于表示扩展的非叶节点的图标。

 void

setTextNonSelectionColor(Color newColor)
          设置选定节点时绘制文本所使用的颜色。

 void

setTextSelectionColor(Color newColor)

 

我们可以通过这些方法来进行个性设置,也可以扩展该类,实现自己的TreeCellRender。

 

我们记得,DefaultTableCellRenderer提供了一个钩子方法:setValue(),可以格式化数据。遗憾的是,DefaultTreeCellRenderer没有提供这个方法。如果想要格式化数据,我们需要extends该Renderer,在返回Renderer Component之前格式化数据——按照“标准”实现的话,业务数据应该存放在UserObject中,所以可以通过UserObject获取数据,再进行格式化。

七.TreeCellEditor

TreeCellEditor接口,扩展了CellEditor,在其上只增加了一个方法:

 Component

getTreeCellEditorComponent(JTree tree,Object value, boolean isSelected, boolean expanded, boolean leaf, int row)
          设置编辑器的初始

 

Swing还提供了一个标准的实现——DefaultCellEditor(它同时还实现了TableCellEditor接口)。它有三种构造方式,使Editor组件成为三者之一:

(1)         JComboBox;

(2)         JCheckBox;

(3)         JTextField。

 

如图所示,为一个ComboBox的DefaultCellEditor实现:

上图看起来不太美观——Editor完全占据了Renderer的地盘,导致节点的图标也被遮住。

 

为解决这个问题,Swing又提供了一个TreeCellEditor实现,即DefaultTreeCellEditor。

 

DefaultTreeCellEditor是个装饰者,它装饰TreeCellEditor的一个实现(通常是DefaultCellEditor),并在内部保留了DefaultTreeCellRenderer的句柄,通过Renderer得到图标,然后,返回一个包含图标和TreeCellEditor组件的容器——这样,在editing时也保留了图标,如下图所示:

 

它的构造函数如下所示:

构造方法摘要

DefaultTreeCellEditor(JTree tree,DefaultTreeCellRenderer renderer)
          使用指定呈现器和默认编辑器,为 JTree 构造一个 DefaultTreeCellEditor 对象。

 

DefaultTreeCellEditor(JTree tree,DefaultTreeCellRenderer renderer, TreeCellEditor editor)
          使用指定的呈现器和指定的编辑器,为 JTree 构造一个 DefaultTreeCellEditor 对象。

 

 

第一个方法没有指定TreeCellEditor,会给它创建一个包含TestEdit的DefaultTreeCellEditor。

 

作为一个装饰者,它将大部分的请求都交由真正的Editor对象处理,除了isCellEditable()——它使用鼠标三击作为触发Editing的手段。

八.树事件

TreeModel激发TreeModelEvent,包括节点的修改、添加、删除;改变树结构等等;

TreeSelectionModel激发TreeSelectionEvent,包括改变选取路径、清除选取等等;

JTree激发TreeExpansionEvent,对应节点的展开和折叠;

DefaultCellEditor激发ChangeEvent——当编辑停止、取消时激发,由CellEditorListener接口进行监听;

                 【注】:editor激发的ChangeEvent有独特的名字,如TableEditor也是如此。

除此之外,JTree还激发鼠标事件。

8.1 TreeSelectionEvent、Listener

Event方法摘要

 Object

cloneWithSource(Object newSource)
          返回接收方的副本,但带有将成为 newSource 的源。

 TreePath

getNewLeadSelectionPath()
          返回当前前导路径

 TreePath

getOldLeadSelectionPath()
          返回以前是前导路径的路径。

 TreePath

getPath()
          返回第一个路径。

 TreePath[]

getPaths()
          返回路径数组——已经添加到该选择中或已从中移除的路径。

     通过isAddedPath()来确定是要添加还是删除。

 boolean

isAddedPath()
          如果已经将第一个路径元素添加到选择中,则返回 true。

 boolean

isAddedPath(int index)
          如果由 index 标识的路径被添加到选择中,则返回 true。

 boolean

isAddedPath(TreePath path)
          如果 path 标识的路径被添加到选择中,则返回 true。

 

前导路径(lead selection path)——即最后添加到选取的路径。

Listener方法摘要

 void

valueChanged(TreeSelectionEvent e)
          每当选择值发生更改时调用。

8.2 TreeExpansionEvent、Listener

Event方法摘要

 

 TreePath

getPath()
          返回到达已被扩展/折叠的值的路径。

Listener方法摘要

 

 void

treeCollapsed(TreeExpansionEvent event)
          每当树中的一个项被折叠时调用。

 

 void

treeExpanded(TreeExpansionEvent event)
          每当树中的一个项被扩展时调用。

 

 

除此之外,还有TreeWillExpandListener:

方法摘要

 void

treeWillCollapse(TreeExpansionEvent event)
          每当树中的一个节点将被折叠时调用。

 void

treeWillExpand(TreeExpansionEvent event)
          每当树中的一个节点将被扩展时调用。

 

此时,如果抛出ExpandVetoException异常,就可以否决Expansion事件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值