我有一段带JCheckBox的JTree源码,它的功能是每个节点都加了JCheckBox:import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.swing.tree.*; 
import javax.swing.event.*; 
import java.util.Enumeration; /** 
* @author Administrator 

*/ 
public class WorkTree {   JTree newtr = null;   DefaultTreeModel treemodel = null;   JTextArea textarea = new JTextArea();   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); 
    treecode.add(new DefaultMutableTreeNode("Config.sys")); 
    treecode.add(new DefaultMutableTreeNode("Boot.ini")); 
    node1.add(new DefaultMutableTreeNode("Explorer.exe")); 
    node1.add(new DefaultMutableTreeNode("Regedit.exe")); 
    node2.add(new DefaultMutableTreeNode("Sound")); 
    node2.add(new DefaultMutableTreeNode("VGA")); 
    node3.add(new DefaultMutableTreeNode("ipconfig.exe")); 
    node3.add(new DefaultMutableTreeNode("net.exe")); 
    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(); 
        textarea.setText(selectNode.toString() + "被选中.\n"); 
        //textarea.setText(ct.toString()); 
         
        //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(textarea)); 
    // panel.add(new JScrollPane(new MyTreeCellRenderer()));     JFrame frame = new JFrame("TreeWork"); 
    frame.setSize(500, 350); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setJMenuBar(new NewJMnu()); 
    frame.setContentPane(panel); 
    // frame.pack(); 
    frame.setVisible(true); 
  }   class NewJMnu extends JMenuBar { 
    public NewJMnu() { 
      // 菜单事件 
      ActionListener menuAction = new ActionListener() { 
        public void actionPerformed(ActionEvent event) { 
          if (event.getActionCommand().equals("Create")) { 
            try { 
              String NameBox = (String) JOptionPane 
                  .showInputDialog(null, "Input the name:", 
                      "Create Node", 
                      JOptionPane.PLAIN_MESSAGE); 
              NewNodeName = NameBox.toString(); 
              if (NameBox.length() < 1) { 
                textarea.setText("Please input a true name!"); 
                return; 
              } 
              ; 
              DefaultMutableTreeNode parentNode = null; 
              DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( 
                  NewNodeName); 
              // newNode.setAllowsChildren(true); 
              TreePath parentPath = newtr.getSelectionPath(); 
              if (parentPath == null) { 
                textarea.setText("Please select a node!"); 
                return; 
              }               parentNode = (DefaultMutableTreeNode) (parentPath 
                  .getLastPathComponent()); 
              treemodel.insertNodeInto(newNode, parentNode, 
                  parentNode.getChildCount()); 
              newtr.scrollPathToVisible(new TreePath(newNode 
                  .getPath())); 
            } catch (Exception E) { 
            } 
            ; 
          } 
          ; 
          if (event.getActionCommand().equals("Delete")) { 
            TreePath[] newtrpath = newtr.getSelectionPaths(); 
            try { 
              if (newtrpath != null) { 
                DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) newtr 
                    .getLastSelectedPathComponent(); 
                TreeNode parent = (TreeNode) selectionNode 
                    .getParent(); 
                if (parent != null && selectionNode != null) { 
                  treemodel 
                      .removeNodeFromParent(selectionNode); 
                } 
              } else { 
                textarea.setText("Please select a node!"); 
                // JOptionPane.showMessageDialog(null, 
                // "请选择要删除的结点!"); 
              } 
            } catch (Exception E) { 
            } 
          } 
          ; 
          if (event.getActionCommand().equals("About")) { 
            textarea.setText("2006.12"); 
          } 
          ; 
          if (event.getActionCommand().equals("Exit")) { 
            System.exit(0); 
          } 
          ; 
        } 
      };       // jMnu菜单 
      JMenu NodeMenu = new JMenu("Node"); 
      JMenu HelpMenu = new JMenu("Help"); 
      JMenuItem item1 = new JMenuItem("Create"); 
      JMenuItem item2 = new JMenuItem("Delete"); 
      JMenuItem item3 = new JMenuItem("About"); 
      JMenuItem item4 = new JMenuItem("Exit"); 
      item1.addActionListener(menuAction); 
      item2.addActionListener(menuAction); 
      item3.addActionListener(menuAction); 
      item4.addActionListener(menuAction); 
      NodeMenu.add(item1); 
      NodeMenu.add(item2); 
      HelpMenu.add(item3); 
      HelpMenu.add(item4); 
      add(NodeMenu); 
      add(HelpMenu); 
    }   }   // 展开所有结点 
  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; 
    } 
  } 
} 现在我想要的是只有最底层节点才能加JCheckBox,其他节点不加,该如何修改或实现呢?

解决方案 »

  1.   

    class CheckboxTreeRender extends DefaultTreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree,
    Object value, boolean sel, boolean expanded,
    boolean leaf, int row, boolean hasFocus) {
    if ((row==0)||(row==1)||(row==7)||(row==10)||(row==11)){
    JCheckBox box = new JCheckBox();
    box.setText(value.toString());
    box.setSelected(sel);
    //box.setBackground(Color.white);
    return box;
    }
    else{
    String stringValue = tree.convertValueToText(value, sel,
    expanded, leaf, row, hasFocus); JLabel label = new JLabel(stringValue);
    label.setComponentOrientation(tree.getComponentOrientation());
    return label;
    }
    }}改这里,应该可以达到要求。
    不知道是不是最好的办法。
      

  2.   

    如果最低层节点全部是leaf的话:
    class CheckboxTreeRender extends DefaultTreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree,
    Object value, boolean sel, boolean expanded,
    boolean leaf, int row, boolean hasFocus) {
    if (leaf){
    JCheckBox box = new JCheckBox();
    box.setText(value.toString());
    box.setSelected(sel);
    //box.setBackground(Color.white);
    return box;
    }
    else{
    String stringValue = tree.convertValueToText(value, sel,
    expanded, leaf, row, hasFocus);JLabel label = new JLabel(stringValue);
    label.setComponentOrientation(tree.getComponentOrientation());
    return label;
    }
    }}试下。是否可行
      

  3.   

    我试过了:
    wolf02009(负无穷) 的可以达到要求了。
    john_sheep(彩虹勇士(结贴就那么难么?)) 的没实现有点问题,不过还是很感谢,结帖了!