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

当JXTreeTable遇到TristateCheckBox(二)

阅读更多

这是本系列的第二部分。在 第一部分 讲述checkboxtreetable用法的基础上,用一个demo演示了如何在程序中获取被选中的节点,以及设置节点前checkbox的状态。

 

运行本demo

 

  1. 在本系列的第一部分下载 jxtreetable_with_checkbox.zip 到本地并解压。
  2. NetBeans主菜单依次选择“文件”——“打开项目”。
  3. 在弹出的“打开项目”对话框中选择刚才解压之后的jxtreetable_with_checkbox目录,点击“打开项目”按钮。
  4. 在附件中下载TestFrame2.zip解压为TestFrame2.java放到cn.vearn.checktreetable包下。
  5. “项目”视图选中TestFrame2,按Shift + F6运行文件。
  6. 选中“getSelectionPaths返回被选中节点的子孙”复选按钮,点击“获取被选中的节点”按钮。


 

设置节点前checkbox的状态

 

那位可能要说了:这还用讲,在节点前checkbox上点一下左键呗。厄,您说得对,但有时候需要在程序中设置某个节点是否被选中。在本文附带的demo中会对checkboxTreeTable中的每一个节点按50%的概率设置是否被选中。闲话少说,看以下代码:

 

//  JXTreeTable构造方法
JXTreeTable treetable = new JXTreeTable(new TestTreeTableModel(createDummyData()));
//  构造checkboxtreetable、紧跟JXTreeTable构造方法。否则...
manager = new CheckTreeTableManager(treetable);
//  设置被选中的节点
manager.getSelectionModel().addPathsByNodes(selectedNodes);
 

其中最后一行使用addPathsByNode方法设置被选中的节点,其中的参数selectedNodes是List的实现,再看createDummyData私有方法,只需要把要设置成选中状态的节点加到selectedNodes中就可以了:

 

/**
     * 构造一个treetablemodel并返回根结点
     *
     * @return 根结点
     */
    private DefaultMutableTreeTableNode createDummyData() {
        selectedNodes = new ArrayList<DefaultMutableTreeTableNode>();
        Random random = new Random();
        TestBean rootbean = new TestBean("根");
        DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode(rootbean);
        for (int i = 0; i < 3; i++) {
            TestBean tb = new TestBean("结点" + i);
            DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode(tb);
            for (int j = 0; j < 3; j++) {
                TestBean leaf = new TestBean("叶子" + i + "-" + j);
                DefaultMutableTreeTableNode tmp = new DefaultMutableTreeTableNode(leaf);
                node.add(tmp);
                if (random.nextInt(2) == 0) {   //  对于每个叶子节点有50%的概率被选中
                    selectedNodes.add(tmp);
                }
            }
            root.add(node);
        }
        return root;
    }
 

dig-in模式

 

在讲解获取被选中的节点 之前,先来说说dig-in模式。这个我也不知道咋翻译,大概说下意思:如果checkboxtreetable处于dig-in模式,那么选中一个节点之后其所有子孙节点都会被选中。如果不处于dig-in呢,那么所有节点只有2种状态(选中或是未选中,没有“部分选中”了),也就是说所有节点的选中状态都是独立的,不会存在选中这个节点把另一个也选中的情况出现。

 

我实现的这个checkboxtreetable是dig-in的,这样做的好处是当一个节点下子孙节点很多时,可以通过选中该节点达到全选和全不选的功能,挺方便的。

 

获取被选中的节点

 

通常再选中某些节点后,我们需要获取它们。步骤如下:

 

  1. 通过CheckTreeSelectionModel的getSelectionPaths方法获取所有被选中节点的TreePath数组。
  2. 调用每一个TreePath的getLastPathComponent方法获得DefaultMutableTreeTableNode的引用。
  3. 调用每个节点的getUserObject方法获得节点对象的引用。
  4. 从userObject中取得需要的字段。

 

TreePath[] treePaths = manager.getSelectionModel().getSelectionPaths();
if (treePaths != null) {
    for (TreePath path : treePaths) {
        DefaultMutableTreeTableNode node = (DefaultMutableTreeTableNode) path.getLastPathComponent();
        TestBean obj = (TestBean) node.getUserObject();
        //	根据需要对obj进行处理
    }
}
 

上面说过在dig-in模式中,选中一个节点之后其所有子孙节点都会被选中。与此同时getSelectionPaths方法只返回 这个节点的TreePath。这样的话,如果我们需要获取它的所有子孙,就需要做一些处理了。在这个demo中定义了一个方法selectedNodeToString,当一个节点是叶子节点,那么把其name字段加到StringBuffer中;如果不是,获取其所有的子节点,对每一个节点递归调用selectedNodeToString方法。

  • 大小: 32.4 KB
分享到:
评论
4 楼 gzx99gzx 2011-08-20  
如何给树上的节点加上tooltip,谢谢
3 楼 weibaojun 2009-07-02  
你好,我想请教一下得到选中的节点后怎么排序让它和tree显示的结果是一样的
2 楼 vearn 2009-05-28  
根据swingx-api-doc

引用
Highlighter provide a mechanism to modify visual attributes of cell rendering components.


也就是说Highlighter是对CellRenderer进行了封装,这样你就可以不用自己写MyTableCellRender就能修改单元格的可视属性。你想修改背景色是把,推荐你用ColorHighlighter,它是Highlighter接口的一个实现。专门修改foregroundcolor和backgroudcolor的。

在TestFrame1.java的30行下面加这么几行代码,看看会发生什么

Pattern p = Pattern.compile("叶子..1");
PatternPredicate pp = new PatternPredicate(p, 0);
treetable.addHighlighter(new ColorHighlighter(pp, Color.RED, null));


再把最后一行改一下,在运行下看看

treetable.addHighlighter(new ColorHighlighter(new HighlightPredicate.NotHighlightPredicate(pp), Color.RED, null));


唉,swingx太懒了,Highlighter根本没文档和demo,要深入学习的话推荐看swingx-api-doc,再有就是去swinglabs forum直接问作者
1 楼 chill_ming 2009-05-26  
请问我重写了DefaultTreeCellRenderer,却发现无法给整行改变颜色,只能将第一列的颜色变红,请问错误出在哪里呢?

public class MyTableCellRender extends DefaultTreeCellRenderer implements TreeCellRenderer {
    /** serialVersionUID */
    private static final long serialVersionUID = 1L;
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
    boolean leaf, int row, boolean hasFocus) {
    // TODO Auto-generated method stub;
//    super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    if (row == 1) {
    treetable.setBackground(Color.RED);
    } else {
    treetable.setBackground(Color.WHITE);
    }
    return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    }
    }

相关推荐

    当JXTreeTable遇到TristateCheckBox(一)

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

    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

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

    swingx-core:Swingx-core 1.6.5的前叉

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

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

    &lt;input is="tristate-checkbox"&gt;... 此属性只能使用 javascript 设置,如下例所示: var cb = document . getElementById ( 'whatever-checkbox' ) ;cb .... 以下示例将无法按预期工作: &lt; input type =" ...

    swingxdemo.rar

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

    swingx-1.6

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

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

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

    swingx

    1. **JXTreeTable**:这是一个复合组件,结合了JTree和JTable的优点,允许用户同时查看和操作树形结构和表格数据。这对于展示具有层次关系的数据非常有用。 2. **JXDatePicker** 和 **JXDateTimePicker**:这些日期...

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

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

    使用swingx创建的折叠菜单

    ### 使用SwingX创建折叠菜单 #### 概述 SwingX是Swing的一个扩展库,为Java开发者提供了丰富的UI组件以及更为灵活的...SwingX还提供了许多其他高级组件,如`JXTreeTable`、`JXMapViewer`等,值得进一步探索和学习。

    swingx.jar

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

    java图书馆swing源码-swingx:带有本地更改的SwingX

    2. **JXTreeTable**: 结合了JTree和JTable的组件,显示树形结构和表格数据。 3. **JXDatePicker**: 提供一个日期选择器,比标准的JCalendar组件更易用。 4. **JXDatePicker**: 提供一个日期选择器,比标准的...

    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 控件

Global site tag (gtag.js) - Google Analytics