2015-07-21 74 views
0

我正在开发一个IntelliJ插件,将弹出对话框以检查CheckboxTree中的值。对于我下面低于Q &答:只有在Swing中选择所有孩子时才选择父节点

Java Swing: Need a good quality developed JTree with checkboxes

但是当我点击一个子节点上也越来越选定父节点。但是我只想选择父节点时,只有当它的所有孩子被选中,否则未选中。

+2

您可以添加到addCheckChangeEventListener - >如果不是所有的孩子都选择了“取消选中父节点” –

回答

1

只需添加该代码

注释代码象下面这样updatePredecessorsWithCheckMode功能,并添加代码之后的for循环

// If at least one child is selected, selecting also the parent 
//   if (childCheckedNode.isSelected) { 
//    parentCheckedNode.isSelected = true; 
//   } 
     } 
    //check the parent if all children are selected 
    if (parentCheckedNode.allChildrenSelected) { 
     parentCheckedNode.isSelected = true; 
    } 

全功能参考

// When a node is checked/unchecked, updating the states of the predecessors 
protected void updatePredecessorsWithCheckMode(TreePath tp, boolean check) { 
    TreePath parentPath = tp.getParentPath(); 
    // If it is the root, stop the recursive calls and return 
    if (parentPath == null) { 
     return; 
    } 
    CheckedNode parentCheckedNode = nodesCheckingState.get(parentPath); 
    DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parentPath.getLastPathComponent(); 
    parentCheckedNode.allChildrenSelected = true; 
    parentCheckedNode.isSelected = false; 
    for (int i = 0; i < parentNode.getChildCount(); i++) { 
     TreePath childPath = parentPath.pathByAddingChild(parentNode.getChildAt(i)); 
     CheckedNode childCheckedNode = nodesCheckingState.get(childPath); 
     // It is enough that even one subtree is not fully selected 
     // to determine that the parent is not fully selected 
     if (!childCheckedNode.allChildrenSelected) { 
      parentCheckedNode.allChildrenSelected = false; 
     } 
     // If at least one child is selected, selecting also the parent 
     // if (childCheckedNode.isSelected) { 
     // parentCheckedNode.isSelected = true; 
     // } 
    } 
    //check the parent if all children are selected 
    if (parentCheckedNode.allChildrenSelected) { 
     parentCheckedNode.isSelected = true; 
    } 
    if (parentCheckedNode.isSelected) { 
     checkedPaths.add(parentPath); 
    } else { 
     checkedPaths.remove(parentPath); 
    } 
    // Go to upper predecessor 
    updatePredecessorsWithCheckMode(parentPath, check); 
} 
+0

@ Madhan:非常感谢您的帮助......它正在运行absolu Tely fine .. :) –

+0

@Mashan需要更多帮助。复选框的字符串长度很大。但它只显示2个字符。我使用下面的代码chechBoxTree.setLayout(new BoxLayout(chechBoxTree,BoxLayout.PAGE_AXIS))更改布局; chechBoxTree.setSize(800,300);但它不反映在UI中。请帮助。 –

+0

@ user667505我找不到你。如果文字太大,它只显示两个字符,后面跟着两个点或类似的东西。如果是这样的话,尝试'((DefaultTreeModel)tree.getModel())。 '。更多地解释问题或将它作为一个不同的问题发布 – Madhan

相关问题