我使用的方法是再new一个对象,把原来的那个覆盖。gc会自动回收原来的那个树。我的想法是这样的。或者你还可以将这些取出来的数据按照你自己想要的方式加到树中的各个孩子节点中就可以了。至于用的方法呢课一看看树这个类下的方法

解决方案 »

  1.   

    下面这个例子就是随着用户的选择自动添加树的节点,你看一下吧
    /**
    FileTree2
    */
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.*;
    import java.text.SimpleDateFormat;import javax.swing.*;
    import javax.swing.tree.*;
    import javax.swing.event.*;public class FileTree2 
    extends JFrame 
    {
    public static final ImageIcon ICON_COMPUTER = 
    new ImageIcon("computer.gif");
    public static final ImageIcon ICON_DISK = 
    new ImageIcon("disk.gif");
    public static final ImageIcon ICON_FOLDER = 
    new ImageIcon("folder.gif");
    public static final ImageIcon ICON_EXPANDEDFOLDER = 
    new ImageIcon("expandedfolder.gif"); protected JTree  m_tree;
    protected DefaultTreeModel m_model;
    protected JTextField m_display;// NEW
    protected JPopupMenu m_popup;
    protected Action m_action;
    protected TreePath m_clickedPath; public FileTree2()
    {
    super("Directories Tree [Popup Menus]");
    setSize(400, 300); DefaultMutableTreeNode top = new DefaultMutableTreeNode(
    new IconData(ICON_COMPUTER, null, "Computer")); DefaultMutableTreeNode node;
    File[] roots = File.listRoots();
    for (int k=0; k<roots.length; k++)
    {
    node = new DefaultMutableTreeNode(new IconData(ICON_DISK, 
    null, new FileNode(roots[k])));
    top.add(node);
    node.add(new DefaultMutableTreeNode( new Boolean(true) ));
    } m_model = new DefaultTreeModel(top);
    m_tree = new JTree(m_model);                m_tree.putClientProperty("JTree.lineStyle", "Angled"); TreeCellRenderer renderer = new 
    IconCellRenderer();
    m_tree.setCellRenderer(renderer); m_tree.addTreeExpansionListener(new 
    DirExpansionListener()); m_tree.addTreeSelectionListener(new 
    DirSelectionListener()); m_tree.getSelectionModel().setSelectionMode(
    TreeSelectionModel.SINGLE_TREE_SELECTION); 
    m_tree.setShowsRootHandles(true); 
    m_tree.setEditable(false); JScrollPane s = new JScrollPane();
    s.getViewport().add(m_tree);
    getContentPane().add(s, BorderLayout.CENTER); m_display = new JTextField();
    m_display.setEditable(false);
    getContentPane().add(m_display, BorderLayout.NORTH);// NEW
    m_popup = new JPopupMenu();
    m_action = new AbstractAction() 

    public void actionPerformed(ActionEvent e)
    {
    if (m_clickedPath==null)
    return;
    if (m_tree.isExpanded(m_clickedPath))
    m_tree.collapsePath(m_clickedPath);
    else
    m_tree.expandPath(m_clickedPath);
    }
    };
    m_popup.add(m_action);
    m_popup.addSeparator(); Action a1 = new AbstractAction("Delete") 

    public void actionPerformed(ActionEvent e)
    {
                                    m_tree.repaint();
    JOptionPane.showMessageDialog(FileTree2.this, 
    "Delete option is not implemented",
    "Info", JOptionPane.INFORMATION_MESSAGE);
    }
    };
    m_popup.add(a1); Action a2 = new AbstractAction("Rename") 

    public void actionPerformed(ActionEvent e)
    {
                                    m_tree.repaint();
    JOptionPane.showMessageDialog(FileTree2.this, 
    "Rename option is not implemented",
    "Info", JOptionPane.INFORMATION_MESSAGE);
    }
    };
    m_popup.add(a2);
    m_tree.add(m_popup);
    m_tree.addMouseListener(new PopupTrigger()); WindowListener wndCloser = new WindowAdapter()
    {
    public void windowClosing(WindowEvent e) 
    {
    System.exit(0);
    }
    };
    addWindowListener(wndCloser);

    setVisible(true);
    } DefaultMutableTreeNode getTreeNode(TreePath path)
    {
    return (DefaultMutableTreeNode)(path.getLastPathComponent());
    } FileNode getFileNode(DefaultMutableTreeNode node)
    {
    if (node == null)
    return null;
    Object obj = node.getUserObject();
    if (obj instanceof IconData)
    obj = ((IconData)obj).getObject();
    if (obj instanceof FileNode)
    return (FileNode)obj;
    else
    return null;
    }// NEW
    class PopupTrigger extends MouseAdapter
    {
    public void mouseReleased(MouseEvent e)
    {
    if (e.isPopupTrigger())
    {
    int x = e.getX();
    int y = e.getY();
    TreePath path = m_tree.getPathForLocation(x, y);
    if (path != null)
    {
    if (m_tree.isExpanded(path))
    m_action.putValue(Action.NAME, "Collapse");
    else
    m_action.putValue(Action.NAME, "Expand");
    m_popup.show(m_tree, x, y);
    m_clickedPath = path;
    }
    }
    }
    }    // Make sure expansion is threaded and updating the tree model
        // only occurs within the event dispatching thread.
        class DirExpansionListener implements TreeExpansionListener
        {
            public void treeExpanded(TreeExpansionEvent event)
            {
                final DefaultMutableTreeNode node = getTreeNode(
                    event.getPath());
                final FileNode fnode = getFileNode(node);            Thread runner = new Thread() 
                {
                  public void run() 
                  {
                    if (fnode != null && fnode.expand(node)) 
                    {
                      Runnable runnable = new Runnable() 
                      {
                        public void run() 
                        {
                           m_model.reload(node);
                        }
                      };
                      SwingUtilities.invokeLater(runnable);
                    }
                  }
                };
                runner.start();
            }        public void treeCollapsed(TreeExpansionEvent event) {}
        } class DirSelectionListener 
    implements TreeSelectionListener 
    {
    public void valueChanged(TreeSelectionEvent event)
    {
    DefaultMutableTreeNode node = getTreeNode(
    event.getPath());
    FileNode fnode = getFileNode(node);
    if (fnode != null)
    m_display.setText(fnode.getFile().
    getAbsolutePath());
    else
    m_display.setText("");
    }
    } public static void main(String argv[]) 
    {
    new FileTree2();
    }
    }
      

  2.   

    class IconCellRenderer 
    extends    JLabel 
    implements TreeCellRenderer
    {
    protected Color m_textSelectionColor;
    protected Color m_textNonSelectionColor;
    protected Color m_bkSelectionColor;
    protected Color m_bkNonSelectionColor;
    protected Color m_borderSelectionColor; protected boolean m_selected; public IconCellRenderer()
    {
    super();
    m_textSelectionColor = UIManager.getColor(
    "Tree.selectionForeground");
    m_textNonSelectionColor = UIManager.getColor(
    "Tree.textForeground");
    m_bkSelectionColor = UIManager.getColor(
    "Tree.selectionBackground");
    m_bkNonSelectionColor = UIManager.getColor(
    "Tree.textBackground");
    m_borderSelectionColor = UIManager.getColor(
    "Tree.selectionBorderColor");
    setOpaque(false);
    } public Component getTreeCellRendererComponent(JTree tree, 
    Object value, boolean sel, boolean expanded, boolean leaf, 
    int row, boolean hasFocus) 

    {
    DefaultMutableTreeNode node = 
    (DefaultMutableTreeNode)value;
    Object obj = node.getUserObject();
    setText(obj.toString());                if (obj instanceof Boolean)
                      setText("Retrieving data..."); if (obj instanceof IconData)
    {
    IconData idata = (IconData)obj;
    if (expanded)
    setIcon(idata.getExpandedIcon());
    else
    setIcon(idata.getIcon());
    }
    else
    setIcon(null); setFont(tree.getFont());
    setForeground(sel ? m_textSelectionColor : 
    m_textNonSelectionColor);
    setBackground(sel ? m_bkSelectionColor : 
    m_bkNonSelectionColor);
    m_selected = sel;
    return this;
    }
        
    /* public void paintComponent(Graphics g) 
    {
    Color bColor = getBackground();
    Icon icon = getIcon(); g.setColor(bColor);
    int offset = 0;
    if(icon != null && getText() != null) 
    offset = (icon.getIconWidth() + getIconTextGap());
    g.fillRect(offset, 0, getWidth() - 1 - offset,
    getHeight() - 1);

    if (m_selected) 
    {
    g.setColor(m_borderSelectionColor);
    g.drawRect(offset, 0, getWidth()-1-offset, getHeight()-1);
    } super.paintComponent(g);
        }*/
    }class IconData
    {
    protected Icon   m_icon;
    protected Icon   m_expandedIcon;
    protected Object m_data; public IconData(Icon icon, Object data)
    {
    m_icon = icon;
    m_expandedIcon = null;
    m_data = data;
    } public IconData(Icon icon, Icon expandedIcon, Object data)
    {
    m_icon = icon;
    m_expandedIcon = expandedIcon;
    m_data = data;
    } public Icon getIcon() 

    return m_icon;
    } public Icon getExpandedIcon() 

    return m_expandedIcon!=null ? m_expandedIcon : m_icon;
    } public Object getObject() 

    return m_data;
    } public String toString() 

    return m_data.toString();
    }
    }class FileNode
    {
    protected File m_file; public FileNode(File file)
    {
    m_file = file;
    } public File getFile() 

    return m_file;
    } public String toString() 

    return m_file.getName().length() > 0 ? m_file.getName() : 
    m_file.getPath();
    } public boolean expand(DefaultMutableTreeNode parent)
    {
    DefaultMutableTreeNode flag = 
    (DefaultMutableTreeNode)parent.getFirstChild();
    if (flag==null)   // No flag
    return false;
    Object obj = flag.getUserObject();
    if (!(obj instanceof Boolean))
    return false;      // Already expanded parent.removeAllChildren();  // Remove Flag File[] files = listFiles();
    if (files == null)
    return true; Vector v = new Vector(); for (int k=0; k<files.length; k++)
    {
    File f = files[k];
    if (!(f.isDirectory()))
    continue; FileNode newNode = new FileNode(f);

    boolean isAdded = false;
    for (int i=0; i<v.size(); i++)
    {
    FileNode nd = (FileNode)v.elementAt(i);
    if (newNode.compareTo(nd) < 0)
    {
    v.insertElementAt(newNode, i);
    isAdded = true;
    break;
    }
    }
    if (!isAdded)
    v.addElement(newNode);
    } for (int i=0; i<v.size(); i++)
    {
    FileNode nd = (FileNode)v.elementAt(i);
    IconData idata = new IconData(FileTree2.ICON_FOLDER, 
    FileTree2.ICON_EXPANDEDFOLDER, nd);
    DefaultMutableTreeNode node = new 
    DefaultMutableTreeNode(idata);
    parent.add(node);

    if (nd.hasSubDirs())
    node.add(new DefaultMutableTreeNode( 
    new Boolean(true) ));
    } return true;
    } public boolean hasSubDirs()
    {
    File[] files = listFiles();
    if (files == null)
    return false;
    for (int k=0; k<files.length; k++)
    {
    if (files[k].isDirectory())
    return true;
    }
    return false;
    }

    public int compareTo(FileNode toCompare)

    return  m_file.getName().compareToIgnoreCase(
    toCompare.m_file.getName() ); 
    } protected File[] listFiles()
    {
    if (!m_file.isDirectory())
    return null;
    try
    {
    return m_file.listFiles();
    }
    catch (Exception ex)
    {
    JOptionPane.showMessageDialog(null, 
    "Error reading directory "+m_file.getAbsolutePath(),
    "Warning", JOptionPane.WARNING_MESSAGE);
    return null;
    }
    }
    }
      

  3.   

    关键是更新 JTree 的 TreeNode 或 TreeModel ,然后刷新就OK,public void Update( JTree jTree ,TreeNode newTreeNode ){
        jTree.setModel( new DefaultTreeModel( newTreeNode ) );
        jTree.repaint();
    }