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

当JXTreeTable遇到TristateCheckBox(三)

阅读更多

这篇小文是本系列( 第一部分 第二部分 )的最终章。主要说下与checkboxtreetable组件相关的几个hack技巧。


运行本demo

 

  1. 在本系列的第一部分下载 jxtreetable_with_checkbox.zip 到本地并解压。
  2. NetBeans主菜单依次选择“文件”——“打开项目”。
  3. 在弹出的“打开项目”对话框中选择刚才解压之后的jxtreetable_with_checkbox目录,点击“打开项目”按钮。
  4. 在附件中下载TestFrame3.zip解压为TestFrame3.java放到cn.vearn.checktreetable包下。
  5. 在附件中下载CheckTreeTableManager2.zip解压为CheckTreeTableManager2.java放到org.jdesktop.swingx.ux包下。
  6. “项目”视图选中TestFrame3,按Shift + F6运行文件。
  7. 点击“显示highlighter”复选按钮,可以切换是否Highlighter。
  8. 点击“禁止列交换”复选按钮,可以切换是否允许通过鼠标拖拽进行列交换。

 

#1 设置Highlighter

 

swingx中的Highlighter内容很丰富,不过在这里只是简单地对奇偶行用不同背景色。实现这个很简单:

 

checkbox1 = new JCheckBox("显示highlighter");
checkbox1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        treetable.setHighlighters(checkbox1.isSelected() ? HighlighterFactory.createSimpleStriping() : null);
    }
});

 

效果是这个样子的:


 

#2 禁止列交换

 

JTable有这样一个特性:通过鼠标拖拽表头中某一列可以对列进行交换。checkboxtreetable也继承了这个特性。不过这导致了一个问题,如果将包含JTree的第一列交换后(见下图),我们无法通过点击树节点之前的checkbox来改变选中状态了。这是由于CheckTreeTableManager通过监听mouseClicked事件来判断鼠标点击坐标,来选中树节点之前的checkbox,交换列之后改变了坐标位置,导致不能改变树节点之前的checkbox。


解决方法也很简单,禁止列交换就可以了:

 

checkbox2 = new JCheckBox("禁止列交换");
checkbox2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        treetable.getTableHeader().setReorderingAllowed(checkbox2.isSelected() ? false : true);
    }
});

 

要是希望含JTree的第一列固定,其他列可以交换可以吗?可以的,不过有点麻烦:

 

treetable = new JXTreeTable(new TestTreeTableModel(createDummyData())) {
            protected JTableHeader createDefaultTableHeader() {
                return new JTableHeader(columnModel) {
                    @Override
                    public void setDraggedColumn(TableColumn aColumn) {
                        if (aColumn == getColumnModel().getColumn(0)) {
                            return;
                        }
                        super.setDraggedColumn(aColumn);
                    }
                };
            }

            protected TableColumnModel createDefaultColumnModel() {
                return new DefaultTableColumnModel() {
                    public void moveColumn(int columnIndex, int newIndex) {
                        if (columnIndex == 0 || newIndex == 0) {
                            return;
                        }
                        super.moveColumn(columnIndex, newIndex);
                    }
                };
            }
        }; //  JXTreeTable构造方法

 

#3 更换CheckTreeTableManager

 

在#2中我们已经发现一个问题,也就是CheckTreeTableManager实际上是以一种hack手段(判断点击坐标位置)来改变checkbox的状态。那么我们换一种方式来实现,通过选中一行(或多行)来选中树节点前的checkbox,用TreeSelectionListener来监听用户事件:

 

public void valueChanged(TreeSelectionEvent e) {
      TreePath path = e.getPath();
      ...
}

 

获得TreePath的引用之后,就和之前的实现一样了。不过这种方式也带来了几个问题:

 

  1. 选中chechbox的行为比较怪异,其他UI库中的checkboxtreetable都是通过点击树节点前的checkbox来改变其状态。
  2. 只要在某一行点击,就会改变checkbox状态,容易误操作。
  3. 先选中一个树节点的checkbox,如果想取消选中,需要按住Ctrl在取消选中该行(Windows环境下),很麻烦。

CheckTreeTableManager和CheckTreeTableManager2究竟如何选择,看您了。

 

后记

 

虽然swing在国内比较冷清,但我还是尽力写好这个系列。是santhosh 的文章帮助我在项目中用上了checkboxtreetable,那么我也希望对社区做一些贡献。能帮上一个人少走些弯路,目的就达到了。本系列至此全部结束,谢谢大家!

 

  • 大小: 18.7 KB
  • 大小: 20.9 KB
分享到:
评论
6 楼 kowen 2011-11-29  
讲的很好, 解决了大问题
5 楼 Vine633 2011-09-28  
TableColumnModel
[img][/img][url][/url][flash=200,200][/flash]
4 楼 qwe3230133 2011-09-22  
不知道作者还经常来这里不,发现一个bug,就是如果修改了带复选框的节点的内容,复选框就消失不见了
3 楼 yuwun 2011-09-13  
怎能不顶哦
2 楼 Laynepeng 2009-08-12  
非常好~收藏!
1 楼 Ethan29 2009-08-12  
Greate!期待您有更加精彩的教程出来!

相关推荐

    当JXTreeTable遇到TristateCheckBox(一)

    这篇博客“当JXTreeTable遇到TristateCheckBox(一)”很可能是讨论如何在JXTreeTable中集成TristateCheckBox,以提供更复杂的用户交互体验。 首先,我们要理解JXTreeTable。它是SwingX库的一部分,SwingX是Java ...

    当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. ...

    treetable所需的包.zip

    - 要实现TreeTable,可以使用NetBeans IDE提供的Visual Library或第三方库SwingX。SwingX库提供了JXTreeTable类,它扩展了JTable,添加了对树形数据的支持。 4. **JXTreeTable** - SwingX的JXTreeTable是实现...

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

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

    swingx-core:Swingx-core 1.6.5的前叉

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

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

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

    swingxdemo.rar

    这些组件包括但不限于:JXDatePicker(日期选择器)、JXTaskPane(任务窗格)、JXTreeTable(树表组合组件)等。SwingX的设计目标是提高开发者的生产力,提供更多的UI选项,以及增强的用户体验。 在"swingxdemo"这...

    swingx-1.6

    1. **组件扩展**:SwingX提供了许多新的组件,如JXTable、JXTabs、JXDatePicker、JXTreeTable等,这些组件具有更丰富的功能和更好的用户体验。例如,JXTable支持复杂的表格操作,如排序、过滤和分页;JXDatePicker...

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

    其次,SwingX还提供了JXTreeTable,将树形结构与表格结合在一起,用于处理层级关系的数据,例如班级-学生的关系。在这个系统中,可能通过JXTreeTable来组织年级、班级和学生的层次结构,方便用户快速定位到特定的...

    SwingX Demo

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

    swingx.jar

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

    substance-swingx.jar

    SwingX库则进一步扩展了Swing的功能,提供了更多的组件和布局,如JXTable、JXTreeTable等,这些组件在数据展示和操作上更为灵活和强大。SwingX还包含了一些高级控件,如日期选择器、颜色选择器等,使得开发者能更...

    java swing swingx 源码

    SwingX库中的JXTreeTable是一个很好的例子,它结合了JTree和JTable的功能,可以在同一视图中显示树形结构和表格数据。开发者可以通过源码研究它的事件处理、数据绑定和渲染机制,这对于开发复杂的业务应用非常有指导...

    jai-imageio和swingx.jar.zip

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

    swingx1.6.1.jar

    swing 扩展组件包,很多有用的组件,比如 日历控件,时间控件,treeTable 控件

    swingx-core-1.6.5-1.jar.zip

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

    swingx最新jar包

    1. **增强的组件**:SwingX添加了一系列新的组件,如JXDatePicker(日期选择器)、JXTaskPane(任务窗格)、JXTreeTable(树表组合)、JXToggleButton(切换按钮)等。这些组件提供了比原生Swing更多的交互性和视觉...

Global site tag (gtag.js) - Google Analytics