`
vearn
  • 浏览: 58858 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

当JXTreeTable遇到TristateCheckBox(一)

阅读更多

treetable、顾名思义—— 提供了tree + table 的功能,是现代用户界面中一个常用的组件 。JXTreeTable是第三方组件库SwingX项目中的一个组件,弥补了Swing标准库中没有 treetable组件的缺憾 。TristateCheckBox是对JCheckBox的扩展——增加了一个“部分选中”状态,加上“选中”、“未选中”组成一个三态复选按钮。在本文中,主要演示在 JXTreeTable中增加 TristateCheckBox——从而实现checkboxtreetable这个新的Swing组件。

 

环境准备

 

软件或资源 要求的版本
Java Development Kit (JDK) 5.0或更高 (我用的是6.0)
NetBeans IDE 6.0或更高
SwingX

0.9.2 (NetBeans中SwingX的配置请看我的上一篇blog

在netbeans 6.0使用swingx组件 )

 

我为什么要写这篇文章

 

我所在的部门,桌面应用的客户端都是由Java Swing构建的。有感于SUN对Swing基础构建支持的缺乏,我们用到了一些第三方组件库,SwingX是其中的一个。在使用JXTreeTable的时候,客户提出要用checkbox来保持选中的状态,一图胜千言:


 

虽然实现了需求,但是总感觉比较土,总想用checkboxtreetable来实现。可是JXTreeTable没有提供这个接口,只好靠

自己扩展了。感谢santhosh 的文章(见参考资料),在他研究的基础上我只做了少许的修改,请看效果图:


简介

 

看了最终的效果图之后,可以很容易的看出checkboxtreetable的特性,我来总结一下:

 

  • 首先它是JXTreeTable的扩展。
  • tree的每个节点前面都有一个三态复选按钮(TristateCheckBox),存在“部分选中”、“选中”、“未选中”3个状态。
  • 当一个节点的复选按钮处于“选中”状态时,其所有子孙节点的复选按钮也会变为“选中”状态。反之亦然。
  • 当一个节点的子孙节点部分选中时,那么该节点的复选按钮会呈现“部分选中”状态(一个灰色的小勾)。
  • 当一个节点的子孙节点都处于“未选中”状态时,那么该节点的复选按钮会呈现“未选中”状态。

使用checkboxtreetable

 

上面的2张图由于是公司的商业产品,不能放源码上来。我在NetBeans下写了一个测试用的小项目,运行步骤如下:

 

  1. 从附件中下载jxtreetable_with_checkbox.zip到本地并解压。
  2. NetBeans主菜单依次选择“文件”——“打开项目”。
  3. 在弹出的“打开项目”对话框中选择刚才解压之后的jxtreetable_with_checkbox目录,点击“打开项目”按钮。
  4. 在“项目”视图中找到jxtreetable_with_checkbox项目,在上下文菜单中点击“运行”,可以看到以下结果:

 


源码解说

 

项目的源码放在2个package中,分述如下:

  • org.jdesktop.swingx.ux:对JXTreeTable的扩展,checkboxtreetable的实现类都放这里了。
  1. TristateCheckBox:三态复选按钮的实现类。对于这个组件,也可以选择其他的实现,比如jide-oss。
  2. CheckTreeSelectionModel:保存对于树节点选中的状态。santhosh的实现,原样照搬。
  3. CheckTreeTableManager:监听mouse事件来改变TristateCheckBox的外观。santhosh的实现,只改了line 30以适应SwingX新版本的API。
  4. CheckTreeCellProvider:绘制复选按钮 + JLabel。这个我用SwingX提供的ComponentProvider替换了santhosh的TreeCellRenderer实现,具体说明待续。
  • cn.vearn.checktreetable:我写的测试用的demo。
  1. TestBean:保存每个节点的各个字段信息。
  2. TestTreeTableModel:TreeTable的model。
  3. 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
8
0
分享到:
评论
6 楼 firefox11 2011-12-06  
jxtreetable可以显示水平线,但设置后发现树型区域的水平线无法显示,能指点一下怎么来设置吗
5 楼 vearn 2011-07-04  
buaadu 写道
你好,请问您的第一个图中‘阈值排列顺序’那列实现的自定义renderer是如何实现的?也是按原来swing种的方法吗?

是的。详见http://download.oracle.com/javase/tutorial/uiswing/components/table.html
4 楼 buaadu 2011-06-02  
你好,请问您的第一个图中‘阈值排列顺序’那列实现的自定义renderer是如何实现的?也是按原来swing种的方法吗?
3 楼 fgg047 2009-02-10  
太好了,非常感谢您!!!
2 楼 vearn 2009-02-09  
fgg047 写道

你好,看到你的东西很激动!
下载下来运行也很成功。但有个问题想请教你一下:
我希望Table表格能够编辑。但事情我很不容易搞定它。你第一个图似乎已经做到了,希望你能教教我,感谢。


下面是我的失败经历:
我改了你的TestTreeTableModel类下的public boolean isCellEditable(Object node, int column) {
        return true;
    }
返回值设成True,运行的结果很意外。

然后调试时DefaultTreeTableModel类的setValueAt方法下的
modelSupport.firePathChanged(new TreePath(getPathToRoot(ttn)));有问题,再往深处看,就晕了。

另外DefaultMutableTreeTableNode的getColumnCount内容居然是return 1;不是我用得不对,就是它这东西太次了。

热切地盼望你的回复!
我的邮件地址:fgg047@sohu.com


厄。如果要编辑单元格的话,这样改一下:

1、TestTreeTableModel.java第18行改为
private Class[] _types = {Object.class, Integer.class, Integer.class, Integer.class, Integer.class};

2、TestTreeTableModel.java第90行改为
return true;

P.S.如果想把修改保存到model再通知视图更新,就重写setValueAt方法
@Override
public void setValueAt(Object aValue, Object node, int col) {
    if (node instanceof DefaultMutableTreeTableNode) {
        DefaultMutableTreeTableNode mutableNode = (DefaultMutableTreeTableNode) node;
        Object o = mutableNode.getUserObject();
        if (o != null && o instanceof TestBean) {
            TestBean bean = (TestBean) o;
            switch (col) {
                case 0:
                    String tmp = (String) aValue;
                    bean.setName(tmp);
                    break;
                case 1:
                    Integer v1 = (Integer) aValue;
                    bean.setValue1(v1);
                    break;
                case 2:
                    Integer v2 = (Integer) aValue;
                    bean.setValue2(v2);
                    break;
                case 3:
                    Integer v3 = (Integer) aValue;
                    bean.setValue3(v3);
                    break;
                case 4:
                    Integer v4 = (Integer) aValue;
                    bean.setValue4(v4);
                    break;
            }
        }
    }
}
1 楼 fgg047 2009-02-07  
你好,看到你的东西很激动!
下载下来运行也很成功。但有个问题想请教你一下:
我希望Table表格能够编辑。但事情我很不容易搞定它。你第一个图似乎已经做到了,希望你能教教我,感谢。


下面是我的失败经历:
我改了你的TestTreeTableModel类下的public boolean isCellEditable(Object node, int column) {
        return true;
    }
返回值设成True,运行的结果很意外。

然后调试时DefaultTreeTableModel类的setValueAt方法下的
modelSupport.firePathChanged(new TreePath(getPathToRoot(ttn)));有问题,再往深处看,就晕了。

另外DefaultMutableTreeTableNode的getColumnCount内容居然是return 1;不是我用得不对,就是它这东西太次了。

热切地盼望你的回复!
我的邮件地址:fgg047@sohu.com

相关推荐

    当JXTreeTable遇到TristateCheckBox(二)

    在这个主题"当JXTreeTable遇到TristateCheckBox(二)"中,我们可以推测博主可能在上一篇文章中介绍了`TristateCheckBox`的基础用法,而在本篇中更深入地探讨了如何将其应用到`JXTreeTable`中。`JXTreeTable`中的每个...

    swingx(一个Swing辅助类包)

    Swingx还包含了JXTreeTable,这是一个结合了树视图和表格视图的组件,对于展示层次结构的数据特别有用,例如文件系统或组织结构。此外,JXImagePanel允许你轻松地在应用程序中显示图像,并提供了缩放和平移的功能。 ...

    swingx-1.6.2.jar.zip

    - JXTreeTable:结合了JTree和JTable的功能,可以在表格中显示层次结构的数据。 - JXTaskPaneContainer:类似于Microsoft Office的任务窗格,可以组织和展示复杂的信息。 - JXToolBar:提供了更灵活的工具栏布局...

    【图形处理相关的jar包】jai-imageio-1.1.jar和swingx-1.6.1.jar下载

    2. JXTreeTable:结合了JTree和JTable的功能,可以在树形结构中显示表格数据。 3. JXDatePicker和JXMonthView:高级日期选择器,提供更友好的用户交互。 4. JXToggleButton:可切换的按钮,支持多种样式和行为。 5. ...

    swingxdemo.rar

    SwingX是一个扩展了Java Swing库的开源项目,它提供了许多高级组件和功能,使得Java桌面应用的开发更加丰富和便捷。"swingxdemo.rar"是一个包含SwingX示例程序的压缩包,用于帮助开发者了解和学习如何使用SwingX库。...

    swingx-core:Swingx-core 1.6.5的前叉

    2. **JXTreeTable**:结合了JTree和JTable的功能,允许在一个表格中显示层次结构的数据,用户可以展开和折叠树节点,同时处理表格数据。 3. **JXDatePicker**和**JXMonthView**:这两者是增强的日历选择组件,...

    treetable所需的包.zip

    当数据发生更改时,需要更新相应的视图。 7. **自定义渲染器** - 为了自定义数据显示,我们需要为表格单元格和树节点创建自定义渲染器,通过实现TableCellRenderer和TreeCellRenderer接口。 8. **性能优化** - ...

    用swingx库开发的学生成绩查询系统

    SwingX库是Java Swing库的一个扩展,它提供了一系列丰富的组件和工具,使得开发者能够创建出功能更加强大且用户友好的图形用户界面(GUI)。在这个"学生成绩查询系统"中,开发者利用了SwingX库的优势,构建了一个...

    tristate-checkbox:一个可能不确定的复选框

    一个可能不确定的复选框基本原理HTML5 为复选框提供了第三种状态,即“不确定”状态。 此属性只能使用 javascript 设置,如下例所示: var cb = document . getElementById ( 'whatever-checkbox' ) ;cb . ...

    swingx.zip

    3. **JXTreeTable**:这是一个结合了树形视图和表格视图的组件,能够同时显示层次结构数据和表格数据,非常适合处理复杂的数据结构。 4. **JXBusyIndicator**:在进行耗时操作时,这个组件可以显示一个忙碌指示器,...

    SwingX Demo

    3. SwingXSet.jar:这应该是SwingX库的核心组件,包含了SwingX库的主要功能和组件,如JXTable、JXTreeTable等,这些组件提供了更丰富的数据展示和交互能力。 4. swingx-all-1.6.5-1.jar:这是SwingX库的一个完整...

    swingx-1.6

    SwingX是一个扩展了Java Swing库的开源项目,它的版本1.6提供了许多增强的组件和功能,使得Java开发者能够创建更加丰富、交互性更强的图形用户界面(GUI)。SwingX是Java开发者社区对标准Java Swing库的一个重要补充...

    使用swingx创建的折叠菜单

    这里定义了一个简单的动作类`SubAction`,当该动作被触发时,会弹出一个新的窗口。 3. **创建折叠菜单类** ```java class FoldingMenu { // 创建第一个任务面板 void addNewPane1(String str, ...

    jai-imageio和swingx.jar.zip

    SwingX包含了诸如JXTreeTable(结合了JTree和JTable的功能)、JXDatePicker(日期选择器)、JXToggleButton(切换按钮)等组件,使得开发者能够创建更为丰富、交互性更强的用户界面。此外,SwingX还提供了一些布局...

    swingx-1.6.1.jar

    2. **JXTreeTable**: 结合了JTree和JTable的功能,可以同时展示数据的层次结构和表格形式。 3. **JXDatePicker**: 提供了一个更友好的日期选择组件,比标准的JCalendar更强大。 4. **JXToggleButton**: 一个带有复...

    swingx-core-1.6.5-1.jar.zip

    2. **JXTreeTable**:结合了JTree和JTable的特点,用于显示树状结构的数据,同时支持表格操作。 3. **JXDatePicker**:一个美观且易用的日期选择器,相比于JCalendar,它提供了更好的用户交互体验。 4. **...

    Java+Swing学生信息管理系统jar包.zip

    SwingX是一个扩展Swing的开源项目,提供了额外的组件和工具,如JXDatePicker、JXTreeTable等,增加了Swing的功能性和易用性。在学生信息管理系统中,SwingX可能被用来实现更复杂的界面元素。 五、Java 7 系统使用的...

    eclipse 皮肤包

    3. **swingx-0.9.3.jar**:这是SwingX库的一个早期版本,包含了对Java Swing的扩展,提供了额外的用户界面组件和功能,如JXTaskPane、JXTreeTable等。这些组件可以增强Eclipse的界面交互性,提供更好的用户体验。 ...

    swingx.jar

    SwingX不仅限于日期控件,它还扩展了许多其他组件,如表格(JXTable)、树表(JXTreeTable)、图表(JFreeChart集成)、拖放支持、可定制的菜单和工具栏等。这些组件都具有高度的可定制性和灵活性,能满足开发者对于...

Global site tag (gtag.js) - Google Analytics