13

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

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

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

4

4 回答 4

9

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

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

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

于 2012-02-20T12:16:25.490 回答
8

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

于 2009-08-03T17:00:00.067 回答
4

根据@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。

于 2009-08-03T19:35:20.813 回答
3

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

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

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

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

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

示例用法:

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

于 2012-10-12T19:49:18.143 回答