带有复选框的JTree

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

  1. 复选框下面+上面有额外的空格; 我想保持它与常规JTree相同。
  2. 我想区分单击复选框本身(应该尝试切换复选框)和单击与复选框关联的文本(这应该允许事件监听器将其解释为单击相应的树节点并采取任何操作是合适的)

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

对于#2,您可以将面板设置为编辑器/渲染器,并添加一个标签以及复选框 – 标签将是文本,并且复选框不会添加文本。

我知道这个问题已经回答了,但我只想澄清一些问题:

1)JID​​E公共层是双许可的(带有类路径exception和免费商业许可的GPL)。 这意味着您可以使用公共层项目而不会出现任何许可问题。 请检查以下链接以确认: http : //www.jidesoft.com/products/oss.htm 。 公共层包括可检查JTree(com.jidesoft.swing.CheckBoxTree)的实现。

2)有一个博客可以追溯到2005年的Master自己,Santhosh Kumar,他在那里解释了如何使用您提到的要求的复选框实现JTree: http : //www.jroller.com/santhosh/entry/jtree_with_checkboxes 。 在我看来,值得一读。

根据@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)使用BorderLayout进行JPanel。

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

该软件包基于John Zukowski的CheckBox节点树示例代码。 它是BSD-2许可的,没有依赖关系。

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

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

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

示例用法:

  • 简单: CheckBoxTreeSample
  • 复杂: WatchEventsFrame

后一个示例还具有递归切换子树以响应被检查或未选中的框的代码(请参阅treeNodesChanged方法)。