By cszhao1980
通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法:
Component |
getTreeCellRendererComponent(JTree tree,Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) |
Swing提供了一个缺省的绘制器——DefaultTreeCellRenderer。它继承自JLabel,提供了一系列方法供改变外观,如:
Font |
getFont() |
Icon |
getLeafIcon() |
Icon |
getOpenIcon() |
Icon |
getClosedIcon() |
void |
setClosedIcon(Icon newIcon) |
void |
setFont(Font font) |
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接口,扩展了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时也保留了图标,如下图所示:
它的构造函数如下所示:
构造方法摘要 |
|
|
|
|
|
第一个方法没有指定TreeCellEditor,会给它创建一个包含TestEdit的DefaultTreeCellEditor。
作为一个装饰者,它将大部分的请求都交由真正的Editor对象处理,除了isCellEditable()——它使用鼠标三击作为触发Editing的手段。
TreeModel激发TreeModelEvent,包括节点的修改、添加、删除;改变树结构等等;
TreeSelectionModel激发TreeSelectionEvent,包括改变选取路径、清除选取等等;
JTree激发TreeExpansionEvent,对应节点的展开和折叠;
DefaultCellEditor激发ChangeEvent——当编辑停止、取消时激发,由CellEditorListener接口进行监听;
【注】:editor激发的ChangeEvent有独特的名字,如TableEditor也是如此。
除此之外,JTree还激发鼠标事件。
Event方法摘要 |
|
|
|
|
|
|
|
|
|
|
通过isAddedPath()来确定是要添加还是删除。 |
|
|
|
|
|
|
前导路径(lead selection path)——即最后添加到选取的路径。
Listener方法摘要 |
||
|
|
Event方法摘要 |
|
||
|
|
||
Listener方法摘要 |
|
||
|
|
|
|
|
|
|
除此之外,还有TreeWillExpandListener:
方法摘要 |
|
|
|
|
|
此时,如果抛出ExpandVetoException异常,就可以否决Expansion事件。