本帖最后由 magic_kid_2010 于 2012-08-29 00:41:53 编辑

解决方案 »

  1.   

    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.Icon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTree;
    import javax.swing.Timer;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;public class Test {
      private static boolean isHidden;  public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.setSize(800, 600);
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
      DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
      DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
      final JTree tree = new JTree(root);
      tree.setCellRenderer(new MyCellRenderer());
      root.add(node1);
      root.add(node2);
      tree.expandRow(0);
      frame.add(tree);
      Timer timer = new Timer(500, new ActionListener() {
      public void actionPerformed(ActionEvent event) {
      isHidden = !isHidden;
      tree.updateUI();
      }
      });
      timer.start();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
      }  private static class MyCellRenderer extends DefaultTreeCellRenderer {
      @Override
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
      leafIcon = getLeafIcon();
      if ("节点1".equals(value.toString()) && !isHidden) {
      Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);
      if (renderer instanceof JLabel) {
      JLabel label = (JLabel)renderer;
      Icon icon = label.getIcon();
      Dimension size = label.getPreferredSize();
      size.width = 100;
      size.height = icon.getIconHeight();
      label.setPreferredSize(size);
      label.setIcon(null);
      }
      return renderer;
      } else {
      return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
      }
      }
      }
    }  
      

  2.   

    DefaultMutableTreeNode 提供遍历树的方法。Enumeration depthFirstEnumeration()  深度优先的顺序遍历
    Enumeration breadthFirstEnumeration() 广度优先的顺序遍历比如:
    Enumeration e = tree.breadthFirstEnumeration();
    while(e.hasMoreElements()){
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
        ..............
        ..............
    }
      

  3.   

    一般来说遍历树结构建议用递归,也就是从根节点开始,进行递归搜索叶子节点。大致如下:    // 主入口函数
        public void setOnline(DefaultMutableTreeNode root, String friends) {
            String[] fs = friends.split("\\s");
            HashSet<String> set = new HashSet<String>(Arrays.asList(fs)); // 转成Set便于快速检索
            setOnlineRecursion(root, set); // 调用递归子函数
            xxoo.UpdateUI(); // 刷新下树显示
        }    // 递归函数
        private void setOnlineRecursion(DefaultMutableTreeNode node, Set onlines) {
            Enumeration<DefaultMutableTreeNode> children = node.children();
            while (children.hasMoreElements()) {
                DefaultMutableTreeNode child = children.nextElement();
                if (child.isLeaf()) { // 是否叶子节点
                    TreeNode treeNode = (TreeNode) node.getUserObject();
                    if (onlines.contains(treeNode.getId())) { // 检查该ID是否在set中
                        treeNode.setStatus(QQStatue.在线);
                    } else {
                        treeNode.setStatus(QQStatue.离线);
                    }
                } else { 
                    // 非叶子节点则继续递归调用了
                    setOnlineRecursion(child, onlines);
                }
            }
        }
      

  4.   

    要实现QQ那种效果,用DefaultMutableTreeNode显得有些力不从心了,就算近似达到,也不好看。
    选用其它技术吧。
      

  5.   

    package com.mvs;import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.Icon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTree;
    import javax.swing.Timer;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;public class JTreeTest {
      private static boolean isHidden;
      public static void main(String[] args) {
      JFrame  frame = new JFrame();
      frame.setSize(800, 600);
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
      DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
      DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
      final JTree tree = new JTree(root);
      tree.setCellRenderer(new MyCellRenderer());
      root.add(node1);
      root.add(node2);
      tree.expandRow(0);
      frame.add(tree);
      final Timer timer = new Timer(500, new ActionListener() {
      public void actionPerformed(ActionEvent event) {
      isHidden = !isHidden;
      tree.updateUI();
      }
      });
      timer.start();
      tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
      public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
      String name=node.toString();   if(node.isLeaf()){
         if(name.equals("节点1")){
          timer.stop();
          tree.setCellRenderer(new MyRenderer());
          }
         }
      }
      });
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
      }  private static class MyCellRenderer extends DefaultTreeCellRenderer {
      @Override
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
      leafIcon = getLeafIcon();
      if ("节点1".equals(value.toString()) && !isHidden) {
      Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);
      if (renderer instanceof JLabel) {
      JLabel label = (JLabel)renderer;
      Icon icon = label.getIcon();
      Dimension size = label.getPreferredSize();
      size.width = 100;
      size.height = icon.getIconHeight();
      label.setPreferredSize(size);
      label.setIcon(null);
      }
      return renderer;
      } else {

      return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
      }
      }
      }
      private static class MyRenderer extends DefaultTreeCellRenderer {
      @Override
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
      leafIcon = getLeafIcon();
      if ("节点1".equals(value.toString()) && !isHidden) {
      Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);   JLabel label = (JLabel)renderer;
      Icon icon = label.getIcon();
      Dimension size = label.getPreferredSize();
      size.width = 100;
      size.height = icon.getIconHeight();
      label.setPreferredSize(size);
      label.setIcon(null);
      }
      return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
      }
      }
    }   
    当鼠标点击时取消闪烁
      

  6.   

    package com.mvs;import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.Icon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTree;
    import javax.swing.Timer;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;public class JTreeTest {
      private static boolean isHidden;
      public static void main(String[] args) {
      JFrame  frame = new JFrame();
      frame.setSize(800, 600);
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
      DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
      DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
      final JTree tree = new JTree(root);
      tree.setCellRenderer(new MyCellRenderer());
      root.add(node1);
      root.add(node2);
      tree.expandRow(0);
      frame.add(tree);
      final Timer timer = new Timer(500, new ActionListener() {
      public void actionPerformed(ActionEvent event) {
      isHidden = !isHidden;
      tree.updateUI();
      }
      });
      timer.start();
      tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
      public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
      String name=node.toString();   if(node.isLeaf()){
         if(name.equals("节点1")){
          timer.stop();
          tree.setCellRenderer(new MyRenderer());
          }
         }
      }
      });
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
      }  private static class MyCellRenderer extends DefaultTreeCellRenderer {
      @Override
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
      leafIcon = getLeafIcon();
      if ("节点1".equals(value.toString()) && !isHidden) {
      Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);
      if (renderer instanceof JLabel) {
      JLabel label = (JLabel)renderer;
      Icon icon = label.getIcon();
      Dimension size = label.getPreferredSize();
      size.width = 100;
      size.height = icon.getIconHeight();
      label.setPreferredSize(size);
      label.setIcon(null);
      }
      return renderer;
      } else {

      return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
      }
      }
      }
      private static class MyRenderer extends DefaultTreeCellRenderer {
      @Override
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
      leafIcon = getLeafIcon();
      if ("节点1".equals(value.toString()) && !isHidden) {
      Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);   JLabel label = (JLabel)renderer;
      Icon icon = label.getIcon();
      Dimension size = label.getPreferredSize();
      size.width = 100;
      size.height = icon.getIconHeight();
      label.setPreferredSize(size);
      label.setIcon(null);
      }
      return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
      }
      }
    }   
    可以点击时取消闪烁