带有复选框的JTree

时间:2009-08-03 16:06:43

标签: java swing checkbox jtree

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

  1. 复选框上方+上方有额外的空格;我想保持它与常规JTree相同。
  2. 我想区分单击复选框本身(应该尝试切换复选框)和单击与复选框关联的文本(这应该允许事件监听器将其解释为单击相应的树节点和采取任何适当的行动)
  3. 有没有办法做这些事情?我四处寻找带有复选框的JTrees,找不到多少。 JIDE看起来不错,但在这种情况下我需要使用免费的开源软件(GPL不行,LGPL没问题)。 (或创建我自己的复选框树)

4 个答案:

答案 0 :(得分:9)

我知道这个问题已经得到了解答,但我只想澄清一些观点:

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

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

答案 1 :(得分:8)

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

答案 2 :(得分: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)使用BorderLayout for JPanel。

答案 3 :(得分:2)

我发布了一个独立的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:它在JCheckBox中使用JLabel + JPanel(如aperkins建议的那样)来区分点击复选框(到检查/取消选中节点)与标签(选择节点)。

示例用法:

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