package dccserverconfig;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.*;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import java.util.Vector;
import javax.swing.tree.*;
import javax.swing.AbstractCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;public class dccDeviceTree {
  public static void main(String args[]) {
    JFrame frame = new JFrame("CheckBox Tree");   final Vector device = new Vector();
    for (int i = 0; i < 5; i++) {
      CheckBoxNode node = new CheckBoxNode("Use AutoComplete" + i, true);
      device.add(node);
    }
    CheckBoxNode a = new CheckBoxNode("Use", true);
    Vector station = new NamedVector(a, device);
    Vector rootVector = new Vector();
    rootVector.add(station);
   JButton test=new JButton("test");
   test.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
         {
           for(int i=0;i<device.size();i++)
           {
           CheckBoxNode node2=  (CheckBoxNode) device.elementAt(i);
          System.out.println("node2.getText()=" + node2.getText());
           System.out.println("node2.isSelected()=" + node2.isSelected());
           }
         }
       });
    //Create Tree
    JTree tree = new JTree(rootVector);
    CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
    tree.setCellRenderer(renderer);    tree.setCellEditor(new CheckBoxNodeEditor(tree));
    tree.setEditable(true);    JScrollPane scrollPane = new JScrollPane(tree);
    frame.add(test,BorderLayout.NORTH);
    frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
    frame.setSize(300, 150);
    frame.setVisible(true);
  }
}

解决方案 »

  1.   

    class CheckBoxNodeRenderer
        implements TreeCellRenderer {
      private JCheckBox leafRenderer = new JCheckBox();  Color selectionBorderColor, selectionForeground, selectionBackground,
      textForeground, textBackground;  protected JCheckBox getLeafRenderer() {
        return leafRenderer;
      }  public CheckBoxNodeRenderer() {
        Font fontValue;
        fontValue = UIManager.getFont("Tree.font");
        if (fontValue != null) {
          leafRenderer.setFont(fontValue);
        }
        Boolean booleanValue = (Boolean) UIManager
            .get("Tree.drawsFocusBorderAroundIcon");
        leafRenderer.setFocusPainted( (booleanValue != null)
                                     && (booleanValue.booleanValue()));    selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor");
        selectionForeground = UIManager.getColor("Tree.selectionForeground");
        selectionBackground = UIManager.getColor("Tree.selectionBackground");
        textForeground = UIManager.getColor("Tree.textForeground");
        textBackground = UIManager.getColor("Tree.textBackground");
      }  public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                    boolean selected,
                                                    boolean expanded, boolean leaf,
                                                    int row,
                                                    boolean hasFocus) {    Component returnValue;
        if (true) {
          String stringValue = tree.convertValueToText(value, selected,
              expanded, leaf, row, false);
          leafRenderer.setText(stringValue);
          leafRenderer.setSelected(false);      leafRenderer.setEnabled(tree.isEnabled());      if (selected) {
            leafRenderer.setForeground(selectionForeground);
            leafRenderer.setBackground(selectionBackground);
          }
          else {
            leafRenderer.setForeground(textForeground);
            leafRenderer.setBackground(textBackground);
          }      if ( (value != null) && (value instanceof DefaultMutableTreeNode)) {
            Object userObject = ( (DefaultMutableTreeNode) value)
                .getUserObject();
            if (userObject instanceof CheckBoxNode) {
              CheckBoxNode node = (CheckBoxNode) userObject;
              leafRenderer.setText(node.getText());
              leafRenderer.setSelected(node.isSelected());
            }
          }
          returnValue = leafRenderer;
        }
        return returnValue;
      }
    }class CheckBoxNodeEditor
        extends AbstractCellEditor implements TreeCellEditor {  CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
      boolean selectedStatementboolean=true;
      ChangeEvent changeEvent = null;  JTree tree;
      DefaultMutableTreeNode mSelectNode;  public CheckBoxNodeEditor(JTree tree) {
        this.tree = tree;
      }  public Object getCellEditorValue() {
        JCheckBox checkbox = renderer.getLeafRenderer();
        CheckBoxNode checkBoxNode = new CheckBoxNode(checkbox.getText(),
                                                     checkbox.isSelected());
        return checkBoxNode;
      }  public boolean isCellEditable(EventObject event) {
        boolean returnValue = false;
        if (event instanceof MouseEvent) {
          MouseEvent mouseEvent = (MouseEvent) event;
          TreePath path = tree.getPathForLocation(mouseEvent.getX(),
                                                  mouseEvent.getY());
          if (path != null) {
            Object node = path.getLastPathComponent();
            if ( (node != null) && (node instanceof DefaultMutableTreeNode)) {
              DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
              mSelectNode = treeNode;
              Object userObject = treeNode.getUserObject();
              //returnValue = ((treeNode.isLeaf()) && (userObject instanceof CheckBoxNode));
              //returnValue = ((userObject instanceof CheckBoxNode));          returnValue = true;
            }
          }
        }
        return returnValue;
      }  public Component getTreeCellEditorComponent(JTree tree, Object value,
                                                  boolean selected,
                                                  boolean expanded, boolean leaf,
                                                  int row) {    Component editor = renderer.getTreeCellRendererComponent(tree, value,
            true, expanded, leaf, row, true);    // editor always selected / focused
        ItemListener itemListener = new ItemListener() {
          public void itemStateChanged(ItemEvent itemEvent) {
            if (stopCellEditing()) {
              fireEditingStopped();
            }
            Object selectObj = mSelectNode.getUserObject();
            String deviceName=( (CheckBoxNode) selectObj).text;
            System.out.println("deviceName=" + deviceName);
            if (! (selectObj instanceof CheckBoxNode))
              return;
            boolean flag = ( (CheckBoxNode) selectObj).isSelected();
             if (mSelectNode.isLeaf() == false) {
              for (int i = 0; i < mSelectNode.getChildCount(); i++) {
                DefaultMutableTreeNode childNode = (DefaultMutableTreeNode)
                    mSelectNode.getChildAt(i);
                Object userObject = childNode.getUserObject();
                ( (CheckBoxNode) userObject).setSelected(flag);
              }
            }
            else
            {
            //   ( (CheckBoxNode) selectObj).setSelected(flag);
           for(int i =0;i<mSelectNode.getParent().getChildCount();i++)
            {
              DefaultMutableTreeNode childNode = (DefaultMutableTreeNode)
                  mSelectNode.getParent().getChildAt(i);
                Object userObject2 = childNode.getUserObject();
                String thisDeviceName = ( (CheckBoxNode) userObject2).text;
                selectedStatementboolean=!selectedStatementboolean;
                 ( (CheckBoxNode) userObject2).setselectedStatement(flag);
               if(deviceName.equals(thisDeviceName))            {
                 ( (CheckBoxNode) userObject2).setSelected(flag);
                 ( (CheckBoxNode) userObject2).setselectedStatement(flag);
                 }          //( (CheckBoxNode) userObject2).setSelected(flag);
            }
            }
          System.out.println("deviceName " + deviceName);
         System.out.println("((CheckBoxNode) " + ((CheckBoxNode) selectObj).isSelected());
          }
        };
        if (editor instanceof JCheckBox) {
          ( (JCheckBox) editor).addItemListener(itemListener);
        }    return editor;
      }
    }class CheckBoxNode extends JCheckBox{
      String text;
      String parent;
      boolean selectedStatement;
     volatile boolean  selected;
      public CheckBoxNode(String text, boolean selected) {
        this.text = text;
        this.selected = selected;
      }
    public boolean getselectedStatement()
      {
        return selectedStatement;
      }  public void setselectedStatement(boolean newValue)
      {
        this.selectedStatement=newValue;
      }
      public boolean isSelected() {
        return selected;
      }  public void setSelected(boolean newValue) {
        selected = newValue;
      }  public String getText() {
        return text;
      }  public void setText(String newValue) {
        text = newValue;
      }  public String toString() {
        return text;
      }  public void setCheckBoxParent(String szParent) {
        parent = szParent;
      }  public String getCheckBoxParent() {
        return parent;
      }
    }class NamedVector
        extends Vector {
      CheckBoxNode name;  public NamedVector(CheckBoxNode name) {
        this.name = name;
      }  public NamedVector(CheckBoxNode name, Vector elements) {
        this.name = name;
        for (int i = 0, n = elements.size(); i < n; i++) {
          add(elements.get(i));
        }
      }  public String toString() {
        return "[" + name + "]";
      }
    }
      

  2.   

    在一个应用中需要树,重别处搞来了个,奇怪的是,我点头上的树,下面的子树变了后,输出值正常
    但是我点子树,SELECTED了以后,输出一直是不正常的,实在是弄不懂了 WHY?
      

  3.   

    楼主可以做一下尝试:
    把dccDeviceTree中的device定义未成员变量
    CheckBoxNodeEditor中的相应代码换为:
    ItemListener itemListener = new ItemListener() {
    public void itemStateChanged(ItemEvent itemEvent) {
    if (stopCellEditing()) {
    fireEditingStopped();
    }
    Object selectObj = mSelectNode.getUserObject();String deviceName=( (CheckBoxNode) selectObj).text;
    //System.out.println("deviceName=" + deviceName);
    if (! (selectObj instanceof CheckBoxNode))
    return;
    boolean flag = ( (CheckBoxNode) selectObj).isSelected();
    if (mSelectNode.isLeaf() == false) {
    for (int i = 0; i < mSelectNode.getChildCount(); i++) {
    DefaultMutableTreeNode childNode = (DefaultMutableTreeNode)
    mSelectNode.getChildAt(i);
    Object userObject = childNode.getUserObject();
    ( (CheckBoxNode) userObject).setSelected(flag);
    }
    }
    else
    {
    //System.out.println("leaf childcount = "+mSelectNode.getParent().getChildCount());
    for(int i =0;i<mSelectNode.getParent().getChildCount();i++)
    {
    DefaultMutableTreeNode childNode = (DefaultMutableTreeNode)
    mSelectNode.getParent().getChildAt(i);Object userObject2 = childNode.getUserObject();
    String thisDeviceName = ( (CheckBoxNode) userObject2).text;
    selectedStatementboolean=!selectedStatementboolean;
    ( (CheckBoxNode) userObject2).setselectedStatement(flag);
    if (deviceName.equals(dccDeviceTree.device.get(i).toString())) {
    ((CheckBoxNode)dccDeviceTree.device.get(i)).setSelected(flag);
    System.out.println("1->" + selectObj);
    System.out.println("2->" +dccDeviceTree.device.get(i));
    System.out.println(selectObj.equals(dccDeviceTree.device.get(i)));
    }
    if(deviceName.equals(thisDeviceName))            {
    ( (CheckBoxNode) userObject2).setSelected(flag);
    ( (CheckBoxNode) userObject2).setselectedStatement(flag);
    }//( (CheckBoxNode) userObject2).setSelected(flag);
    }}
    //System.out.println("deviceName " + deviceName);
    //System.out.println("((CheckBoxNode) " + ((CheckBoxNode) selectObj).isSelected());
    }
    };ps:在main中加上这句啊frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);!!!
      

  4.   

    多谢阿CrazyGou(阿狗)(...) ( ) 信誉:100    Blog   加为好友 
      哎 自己着么就没想到这点呢...~~感谢感谢 万分感谢 揭贴