Java 带有复选框的JTree
我需要在JTree中添加复选框。自定义TreeCellRenderer/TreeCellEditor似乎是正确的方法。到目前为止,我用过。它工作正常,除了两件事:Java 带有复选框的JTree,java,swing,checkbox,jtree,Java,Swing,Checkbox,Jtree,我需要在JTree中添加复选框。自定义TreeCellRenderer/TreeCellEditor似乎是正确的方法。到目前为止,我用过。它工作正常,除了两件事: 复选框上方+下方有额外的空白;我想保持它和普通的JTree一样 我想区分单击复选框本身(应尝试切换复选框)和单击与复选框关联的文本(应允许事件侦听器将其解释为单击相应的树节点并采取任何适当的操作) 有办法做这些事情吗?我四处寻找带有复选框的JTree,找不到多少。JIDE看起来不错,但在这种情况下,我需要使用免费的开源软件(GPL不行
有办法做这些事情吗?我四处寻找带有复选框的JTree,找不到多少。JIDE看起来不错,但在这种情况下,我需要使用免费的开源软件(GPL不行,LGPL也行)。(或创建我自己的复选框树)至于#2,您可以将一个面板作为编辑器/渲染器,并在复选框中添加一个标签-标签将是文本,而复选框不会添加文本。根据@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。我知道这个问题已经得到了回答,但我只想澄清一些问题: 1) JIDE Common Layer具有双重许可(GPL具有类路径例外和免费商业许可)。这意味着您可以使用公共层项目,而无需任何许可问题。请检查以下链接以确认:。公共层包括一个可检查JTree(com.jidesoft.swing.CheckBoxTree)的实现
2) 大师本人Santhosh Kumar在2005年写了一个博客,他在博客中解释了如何实现一个带有复选框的JTree,其中包含您提到的需求:。在我看来,这本书值得一读。我发布了一个独立的项目,可从Maven Central获得,网址为
org.scijava:swing checkbox tree
该软件包基于John Zukowski的代码。它是BSD-2许可的,没有依赖性
它允许混合和匹配DefaultMutableTreeNode
和CheckBoxNodeData
节点类型。它还允许复选框节点作为非叶节点
关于问题的问题#1:我没有在所有平台上进行测试,但在我的OS X系统上,CheckBoxNodeData
节点与DefaultMutableTreeNode
节点的像素高度完全相同
关于问题的问题#2:它在JPanel
中使用JCheckBox
+JLabel
(如建议)来区分单击复选框(选中/取消选中节点)和标签(选择节点)
示例用法:
- 简单:
- 复杂:
后一个示例还提供了递归切换子树的代码,以响应选中或取消选中的框(请参见
treeNodeChanged
方法)。请注意,如果您只是复制DefaultTreeCellRenderer代码并用JPanel替换JLabel的扩展,您还必须删除许多“为性能而重写”方法,否则您将拥有一个空白的JTree.JIDE Common Layer会断开所有collor方案,因为它安装了自己的UI,没有找到如何修复的方法,如果有人知道如何修复,请共享它。