treetable、顾名思义—— 提供了tree + table 的功能,是现代用户界面中一个常用的组件 。JXTreeTable是第三方组件库SwingX项目中的一个组件,弥补了Swing标准库中没有 treetable组件的缺憾 。TristateCheckBox是对JCheckBox的扩展——增加了一个“部分选中”状态,加上“选中”、“未选中”组成一个三态复选按钮。在本文中,主要演示在 JXTreeTable中增加 TristateCheckBox——从而实现checkboxtreetable这个新的Swing组件。
环境准备
我为什么要写这篇文章
我所在的部门,桌面应用的客户端都是由Java Swing构建的。有感于SUN对Swing基础构建支持的缺乏,我们用到了一些第三方组件库,SwingX是其中的一个。在使用JXTreeTable的时候,客户提出要用checkbox来保持选中的状态,一图胜千言:
虽然实现了需求,但是总感觉比较土,总想用checkboxtreetable来实现。可是JXTreeTable没有提供这个接口,只好靠
自己扩展了。感谢santhosh
的文章(见参考资料),在他研究的基础上我只做了少许的修改,请看效果图:
简介
看了最终的效果图之后,可以很容易的看出checkboxtreetable的特性,我来总结一下:
- 首先它是JXTreeTable的扩展。
- tree的每个节点前面都有一个三态复选按钮(TristateCheckBox),存在“部分选中”、“选中”、“未选中”3个状态。
- 当一个节点的复选按钮处于“选中”状态时,其所有子孙节点的复选按钮也会变为“选中”状态。反之亦然。
- 当一个节点的子孙节点部分选中时,那么该节点的复选按钮会呈现“部分选中”状态(一个灰色的小勾)。
- 当一个节点的子孙节点都处于“未选中”状态时,那么该节点的复选按钮会呈现“未选中”状态。
使用checkboxtreetable
上面的2张图由于是公司的商业产品,不能放源码上来。我在NetBeans下写了一个测试用的小项目,运行步骤如下:
- 从附件中下载jxtreetable_with_checkbox.zip到本地并解压。
- NetBeans主菜单依次选择“文件”——“打开项目”。
- 在弹出的“打开项目”对话框中选择刚才解压之后的jxtreetable_with_checkbox目录,点击“打开项目”按钮。
- 在“项目”视图中找到jxtreetable_with_checkbox项目,在上下文菜单中点击“运行”,可以看到以下结果:
源码解说
项目的源码放在2个package中,分述如下:
- org.jdesktop.swingx.ux:对JXTreeTable的扩展,checkboxtreetable的实现类都放这里了。
- TristateCheckBox:三态复选按钮的实现类。对于这个组件,也可以选择其他的实现,比如jide-oss。
- CheckTreeSelectionModel:保存对于树节点选中的状态。santhosh的实现,原样照搬。
- CheckTreeTableManager:监听mouse事件来改变TristateCheckBox的外观。santhosh的实现,只改了line 30以适应SwingX新版本的API。
- CheckTreeCellProvider:绘制复选按钮 + JLabel。这个我用SwingX提供的ComponentProvider替换了santhosh的TreeCellRenderer实现,具体说明待续。
- cn.vearn.checktreetable:我写的测试用的demo。
- TestBean:保存每个节点的各个字段信息。
- TestTreeTableModel:TreeTable的model。
- TestFrame1:demo入口。
参考资料
首先是santhosh的3篇blog
http://www.jroller.com/page/santhosh/20050610#jtree_with_checkboxes
http://jroller.com/page/santhosh?entry=jxtreetable_with_checkboxes
http://jroller.com/page/santhosh?entry=checktree_with_without_selection_digging
- 大小: 41.3 KB
- 大小: 48.4 KB
- 大小: 9.8 KB
分享到:
相关推荐
NULL 博文链接:https://vearn.iteye.com/blog/319943
一个可能不确定的复选框基本原理HTML5 为复选框提供了第三种状态,即“不确定”状态。 此属性只能使用 javascript 设置,如下例所示: var cb = document . getElementById ( 'whatever-checkbox' ) ;cb . ...
swing 扩展组件包,很多有用的组件,比如 日历控件,时间控件,treeTable 控件
Name: org/jdesktop/swingx/JXTreeTable.class Java-Bean: True Name: org/jdesktop/swingx/auth/DefaultUserNameStore.class Java-Bean: True Name: org/jdesktop/swingx/auth/JAASLoginService.class Java-Bean:...