可以参考composite模式。
http://www.jdon.com/designpatterns/composite.htm

解决方案 »

  1.   

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;public class TreeDemo1
    {
        public TreeDemo1()
        {
            JFrame f = new JFrame("TreeDemo");
            Container contentPane = f.getContentPane();
            
            String[] s1 = {"公司文件","个人信件","私人文件"};
            String[] s2 = {"本机磁盘(C:)","本机磁盘(D:)","本机磁盘(E:)"};
            String[] s3 = {"奇摩站","职棒消息","网络书店"};
            Hashtable hashtable1 = new Hashtable();
            Hashtable hashtable2 = new Hashtable();
            hashtable1.put("我的公文包",s1);
            hashtable1.put("我的电脑",s2);
            hashtable1.put("收藏夹",hashtable2);
            hashtable2.put("网站列表",s3);
            JTree tree = new JTree(hashtable1);
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setViewportView(tree);
            
            contentPane.add(scrollPane);
            f.pack();
            f.setVisible(true);
            
            f.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });    }    public static void main(String args[]) {
        
            new TreeDemo1();
        }
    }
      

  2.   

    可以通过定制树模型来构建。也可以继承DefaultMutableTreeNode,添加你需要的变量和操作
    有一本好的《java2 swing 图形设计》的书,上面有一个详细的树的例子-用树来查看磁盘文件和目录。
      

  3.   

    http://www.jdon.com/designpatterns/composite.htm 没有这个站点啊
      

  4.   

    我昨天看这个站点还没有问题的,出了毛病了,我faint!
    其实DefaultMutableTreeNode类本身的实现就是一个典型的composite模式的使用。只是从前台JTree的调用者来说大多数情况下并没有实际关心它的实现的必要,而是只关心DefaultMutableTreeNode的显示部分,就是树的节点的表达。实际上就是这个类本身的代码,也是遵从composite模式来组织的。而恰恰树的数据结构用这种模式是最合适的。
    对于每一个DefaultMutableTreeNode,都有一个UserObject对象,前者可以看作后者的某种对应。UserObject可以是很多类型,如果只是简单的String类,那么就是一个简单的前台显示,所有的树枝节点树叶节点之间的关系就通过对应的DefaultMutableTreeNode之间的关系得到了组织。
    如果不是要做树的显示,用到别的后台应用的时候,需要自己定义这种树机构的数据关系,就要使用composite的模式,就是要设计自己的不用于显示的类似于DefaultMutableTreeNode的类。
    楼主可以找相关的模式实现的文章看看。
    昨天留的网址,好在文章我有备份,楼主如果需要的话可以留个Email。
      

  5.   

    shadow_dancer(影舞者) 太深奥啊 能不能举个例子来说明, 这样我好理解一些 因为我对这方面太陌生了 麻烦了 谢谢
      

  6.   

    就用文件的例子吧。首先,树枝节点(目录)和树叶节点(实际文件)都由一个接口产生,不妨设这个接口为:
    public Interface MyFile{
        public MyFile{
       }
        // 打开文件的方法,对目录和文件都适用 
        public void open() {
       }
       /**
       *还可以定义一些其他的公共方法
       */
    }
    对于目录,实现这个接口。类似这种形式:
    import java.util.Vector;
    public class MyDirectory implements MyFile { 
      private Vector childrenFiles = new Vector(); 
      public MyDirectory{}
      //实现接口中的针对目录的具体的open方法
      public void open() {
      //具体的实现处理
      }
      public void addFile(MyFile childmf){
        childrenFiles.add(childmf);
       //为目录添加文件的方法。注意参数是接口类型的声明,实际可以是目录,也可以是文件。
     }
      public void remove(MyFile childmf){
        childrenFiles.remove(childmf);
       //删除目录下的一个文件的方法,也可以是一个目录。
     }
      public Vector getChildrenFiles() {
        return childrenFiles;
       //返回这个目录下所有的子节点文件。
     }
       /*
       *  其他公共方法的实现
       */
    }对于树叶节点的文件,其类可以定义为:
    public class MyLeafFile implements MyFile {
      public MyLeafFile () {}
      public void open{
       //具体实现对于树叶节点文件的打开操作。
     } 
      /*
      *其他公共方法的具体实现
      */
     }
    这是一个简单的例子,主要是想表明通常的这种设计方式。通用的接口定义树枝和树叶节点的公共的一些属性和方法,但从功能上讲,树枝节点的功能要更多。体现在树枝节点具有组织其Children子结点的Vector类型的属性,并且提供add、remove和getChildrenFiles等对于子节点的操作方法。而叶节点的类中则没有这样的类和方法。
    这只是一个很简单的实现,但是希望能对你理解这种模式有所帮助。:)
      

  7.   

    sorry,应为“而叶节点的类中则没有这样的属性和方法。”笔误。