JTree with checkboxes

后端 未结 4 2069
温柔的废话
温柔的废话 2020-12-05 19:58

I need to add checkboxes to a JTree. A custom TreeCellRenderer/TreeCellEditor seems like the right approach. So far I used the CheckBoxNodeRenderer approach in this webpage.

相关标签:
4条回答
  • 2020-12-05 20:25

    I know this question has been answered already, but i just want to clear some points:

    1) JIDE Common Layer is dual-licensed (GPL with classpath exception and free commercial license). This means that you can use the Common Layer Project without any licensing issues. Please check the following link to confirm: http://www.jidesoft.com/products/oss.htm. The Common Layer includes an implementation of a checkable JTree (com.jidesoft.swing.CheckBoxTree).

    2) There's a blog dated from 2005 from the Master himself, Santhosh Kumar, where he explains how to implement a JTree with checkboxes with the requirements you mentioned: http://www.jroller.com/santhosh/entry/jtree_with_checkboxes. It's worth reading it, in my opinion.

    0 讨论(0)
  • 2020-12-05 20:37

    As for #2, you could make a panel be the editor/renderer, and add a label along with the checkbox - the label would be the text, and the check box would not have the text added to it.

    0 讨论(0)
  • 2020-12-05 20:41

    per @aperkins suggestion this is what I ended up doing in the TableCellRenderer, it seems to work well:

    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);
    

    The keys for getting rid of unwanted space in the margins seems to be (a) calling JCheckBox.setMargin() to reduce the checkbox margin, and (b) using a BorderLayout for JPanel.

    0 讨论(0)
  • 2020-12-05 20:42

    I have released a standalone Swing Checkbox Tree project, available from Maven Central as org.scijava:swing-checkbox-tree.

    The package is based on John Zukowski's CheckBox Node Tree Sample code. It is BSD-2-licensed with no dependencies.

    It allows mixing and matching of DefaultMutableTreeNode and CheckBoxNodeData node types. It also allows check box nodes as non-leaf nodes.

    Regarding the question's issue #1: I did not test on all platforms, but on my OS X systems, the CheckBoxNodeData nodes are exactly the same height in pixels as the DefaultMutableTreeNode nodes.

    Regarding the question's issue #2: it uses a JCheckBox + JLabel in a JPanel (as aperkins suggests) to differentiate between clicking on a check box (to check/uncheck a node) versus a label (to select a node).

    Example usages:

    • Simple: CheckBoxTreeSample
    • Complex: WatchEventsFrame

    The latter example also has code for recursively toggling subtrees in response to boxes being checked or unchecked (see the treeNodesChanged method).

    0 讨论(0)
提交回复
热议问题