小弟在网上找一个在JTree里面加上JCheckbox的例子,运行以后发现加的明明是checkbox却为什么不能多选只能单选呢?希望各位大侠可怜可怜小弟帮忙看下哪里是否有什么属性需要修改下?不胜感激!
import java.awt.*;
import javax.swing.*;import javax.swing.tree.*;
import javax.swing.event.*;
import java.util.Enumeration;/**
* @author 
*
*/
public class WorkTree {  JTree newtr = null;  DefaultTreeModel treemodel = null;
  
  public String NewNodeName;  public static void main(String[] args) {
    new WorkTree();
  }  public WorkTree() {    // 生成树结构
    // JCheckBox chbox = new JCheckBox("aa");
    DefaultMutableTreeNode treecode = new DefaultMutableTreeNode("c:\\",true);
    DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Windows");
    DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Drivers");
    DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("System32");
    treecode.add(node1);
    treecode.add(node2);
    node1.add(node3);
    DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("Config.sys");
    DefaultMutableTreeNode node5 = new DefaultMutableTreeNode("Boot.ini");
    DefaultMutableTreeNode node6 = new DefaultMutableTreeNode("Explorer.exe");
    DefaultMutableTreeNode node7 = new DefaultMutableTreeNode("Regedit.exe");
    DefaultMutableTreeNode node8 = new DefaultMutableTreeNode("Sound");
    DefaultMutableTreeNode node9 = new DefaultMutableTreeNode("VGA");
    DefaultMutableTreeNode node10 = new DefaultMutableTreeNode("ipconfig.exe");
    DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("net.exe");
       
    treecode.add(node4);
    treecode.add(node5);
    node1.add(node6);
    node1.add(node7);
    node2.add(node8);
    node2.add(node9);
    node3.add(node10);
    node3.add(node11);
    newtr = new JTree(treecode);
    CheckboxTreeRender cbtr=new CheckboxTreeRender();
    newtr.setCellRenderer(cbtr);
    newtr.setRowHeight(20);
    // newtr.add(chbox);
    treemodel = (DefaultTreeModel) newtr.getModel();    // MyTreeCellRenderer newTreeNode = new MyTreeCellRenderer();
    // newTreeNode.    // 将所有结点展开
       expandAll(newtr, new TreePath(newtr.getModel().getRoot()));     // 添加树的选择事件
    newtr.addTreeSelectionListener(new TreeSelectionListener() {
      public void valueChanged(TreeSelectionEvent e) {
        // try {
        JTree tree = (JTree) e.getSource();
        CheckboxTreeRender ct=(CheckboxTreeRender)tree.getCellRenderer();
        DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) tree
            .getLastSelectedPathComponent();
        //Data data = (Data) ((DefaultMutableTreeNode) e.getSource()).getUserObject();
        // } catch (Exception E) {
        // return;
        // }
      }
    });    // 生成面板
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(1, 2));
    panel.add(new JScrollPane(newtr));
   //  panel.add(new JScrollPane(new MyTreeCellRenderer()));
 
    JFrame frame = new JFrame("TreeWork");
    frame.setSize(300, 350);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(panel);
    // frame.pack();
    frame.setVisible(true);
  }   // 展开所有结点
  public static void expandAll(JTree tree, TreePath path) {
    // assert (tree != null) && (path != null);
    tree.expandPath(path);
    TreeNode node = (TreeNode) path.getLastPathComponent();
    for (Enumeration i = node.children(); i.hasMoreElements();) {
      expandAll(tree, path.pathByAddingChild(i.nextElement()));
    }
  }  class CheckboxTreeRender extends DefaultTreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree,
        Object value, boolean sel, boolean expanded,
        boolean leaf, int row, boolean hasFocus) {
      JCheckBox box = new JCheckBox();
      box.setText(value.toString());
      box.setSelected(sel);
      //box.setBackground(Color.white);
      return box;
    }
  }
}

解决方案 »

  1.   

    Object value, boolean sel, boolean expanded, 
            boolean leaf, int row, boolean hasFocus) { 
          JCheckBox box = new JCheckBox(); 
          box.setText(value.toString()); 
          box.setSelected(sel); 
          //box.setBackground(Color.white); 你这渲染器里面的sel的值只有在你选中的时候才会为true  你试着CTRL多选几个叶子节点 那么会有多个被选中  这个例子只是一个简单的效果 具体可以这么做:重载DefaultMutableTreeNode  -》  Xnode
    增加属性checked = false;
    每次选中的时候、
     XnodeselectNode = (Xnode) tree 
                .getLastSelectedPathComponent(); 
    Xnode.setChecked(!Xnode.getChecked());repaint即可。
    当然render里面的
     box.setSelected(sel); 
    要设置为你 当前节点的checked的值