带有复选框的 JTree

Posted

技术标签:

【中文标题】带有复选框的 JTree【英文标题】:JTree with checkboxes 【发布时间】:2010-11-16 10:17:47 【问题描述】:

我需要在 JTree 中添加复选框。自定义 TreeCellRenderer/TreeCellEditor 似乎是正确的方法。到目前为止,我使用了the CheckBoxNodeRenderer approach in this webpage。它工作正常,除了两件事:

    复选框的 + 上方有额外的空格;我想让它和普通的 JTree 一样。 我想区分单击复选框本身(应尝试切换复选框)和单击与复选框关联的文本(应允许事件侦听器将其解释为单击相应的树节点和采取任何适当的行动)

有没有办法做这些事情?我四处寻找,找不到太多。 JIDE 看起来不错,但在这种情况下我需要使用免费的开源软件(GPL 不行,LGPL 可以)。 (或创建我自己的复选框树)

【问题讨论】:

【参考方案1】:

我知道这个问题已经回答了,但我只是想澄清几点:

1) JIDE Common Layer 是双重许可的(具有类路径例外的 GPL 和免费商业许可)。这意味着您可以在没有任何许可问题的情况下使用公共层项目。请检查以下链接以确认:http://www.jidesoft.com/products/oss.htm。公共层包括一个可检查的 JTree (com.jidesoft.swing.CheckBoxTree) 的实现。

2) 大师本人 Santhosh Kumar 在 2005 年发表了一篇博客,他在其中解释了如何根据您提到的要求实现带有复选框的 JTree:http://www.jroller.com/santhosh/entry/jtree_with_checkboxes。在我看来,值得一读。

【讨论】:

JIDE Common Layer 破坏了你所有的配色方案,因为它安装了自己的 UI,没有找到如何修复,如果有人知道请分享它。【参考方案2】:

至于 #2,您可以将面板设置为编辑器/渲染器,并在复选框中添加标签 - 标签将是文本,而复选框不会添加文本。

【讨论】:

请注意,如果您只是复制 DefaultTreeCellRenderer 代码并将 JLabel 的扩展名替换为 JPanel,您还必须删除许多“为性能而重写”方法,否则您将有一个空白的 JTree。【参考方案3】:

根据@aperkins 的建议,这是我最终在 TableCellRenderer 中所做的,它似乎运行良好:

final private JPanel nodeRenderer = new JPanel();
final private JLabel label = new JLabel();
final private JCheckBox check = new JCheckBox();

     ...

// in constructor:
final Insets inset0=new Insets(0,0,0,0);        
this.check.setMargin(inset0);
this.nodeRenderer.setLayout(new BorderLayout()); 
this.nodeRenderer.add(this.check, BorderLayout.WEST);
this.nodeRenderer.add(this.label, BorderLayout.CENTER);

消除边距中不需要的空间的关键似乎是 (a) 调用 JCheckBox.setMargin() 以减少复选框边距,以及 (b) 为 JPanel 使用 BorderLayout。

【讨论】:

【参考方案4】:

我已经发布了一个独立的Swing Checkbox Tree 项目,可以从 Maven Central 以org.scijava:swing-checkbox-tree 获得。

该软件包基于 John Zukowski 的 CheckBox Node Tree Sample 代码。它是 BSD-2 许可的,没有依赖关系。

它允许混合和匹配DefaultMutableTreeNodeCheckBoxNodeData 节点类型。它还允许复选框节点作为非叶节点。

关于问题的问题 #1:我没有在所有平台上进行测试,但在我的 OS X 系统上,CheckBoxNodeData 节点与DefaultMutableTreeNode 节点的像素高度完全相同。

关于问题#2:它在JPanel 中使用JCheckBox + JLabel(如aperkins 建议的那样)来区分单击复选框(选中/取消选中节点)与标签(选择一个节点)。

示例用法:

简单:CheckBoxTreeSample 复杂:WatchEventsFrame

后一个示例还包含用于递归切换子树的代码,以响应选中或取消选中的框(请参阅treeNodesChanged 方法)。

【讨论】:

以上是关于带有复选框的 JTree的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing:需要具有复选框的高质量开发 JTree

使用 JCheckBox 节点进行 JTree 渲染

JCheckBoxTree 初始状态问题

Java中带复选框的微信牛牛房卡开发的实现和应用

带有复选框的 Telerik 网格 - 网格最初绘制时复选框未显示

带有重力形式的复选框动态选择