畫一棵簡單樹的三種方法

          首先我使用SWT中的TreeViewer類畫了一棵簡單樹。
          代碼如下:

          package net.blogjava.lzqdiy.tree;

          import java.util.List;

          import org.eclipse.jface.viewers.IStructuredContentProvider;
          import org.eclipse.jface.viewers.ITreeContentProvider;
          import org.eclipse.jface.viewers.LabelProvider;
          import org.eclipse.jface.viewers.TreeViewer;
          import org.eclipse.jface.viewers.Viewer;
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.graphics.Image;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Tree;

          public class TreeTest
          {

              
          class TreeLabelProvider extends LabelProvider
              
          {
                  
          public String getText(Object element)
                  
          {
                      ITreeEntry entry 
          = (ITreeEntry) element;
                      
          return entry.getName();
                  }


                  
          public Image getImage(Object element)
                  
          {
                      
          return null;
                  }

              }


              
          class TreeContentProvider implements IStructuredContentProvider,
                      ITreeContentProvider
              
          {
                  
          public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
                  
          {
                  }


                  
          public void dispose()
                  
          {
                  }


                  
          public Object[] getElements(Object inputElement)
                  
          {
                      
          if (inputElement instanceof List)
                      
          {
                          List list 
          = (List) inputElement;
                          
          return list.toArray();
                      }
           else
                          
          return new Object[0];
                  }


                  
          public Object[] getChildren(Object parentElement)
                  
          {
                      ITreeEntry entry 
          = (ITreeEntry) parentElement;
                      List list 
          = entry.getChildren();
                      
          if (list == null || list.isEmpty())
                      
          {
                          
          return new Object[0];
                      }
           else
                          
          return list.toArray();
                  }


                  
          public Object getParent(Object element)
                  
          {
                      
          return null;
                  }


                  
          public boolean hasChildren(Object element)
                  
          {
                      ITreeEntry entry 
          = (ITreeEntry) element;
                      List list 
          = entry.getChildren();
                      
          if (list == null || list.isEmpty())
                      
          {
                          
          return false;
                      }
           else
                          
          return true;
                  }

              }


              
          private Tree tree;

              
          /**
               * Launch the application
               * 
               * 
          @param args
               
          */

              
          public static void main(String[] args)
              
          {
                  
          try
                  
          {
                      TreeTest window 
          = new TreeTest();
                      window.open();
                  }
           catch (Exception e)
                  
          {
                      e.printStackTrace();
                  }

              }


              
          /**
               * Open the window
               
          */

              
          public void open()
              
          {
                  
          final Display display = Display.getDefault();
                  
          final Shell shell = new Shell();
                  shell.setSize(
          350250);
                  shell.setText(
          "SWT Application");
                  
          //

                  shell.open();

                  
          final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER);
                  treeViewer.setLabelProvider(
          new TreeLabelProvider());
                  treeViewer.setContentProvider(
          new TreeContentProvider());
                  Object inputObj 
          = DataFactory.createTreeData();
                  treeViewer.setInput(inputObj);
                  tree 
          = treeViewer.getTree();
                  tree.setBounds(
          6644268165);
                  shell.layout();
                  
          while (!shell.isDisposed())
                  
          {
                      
          if (!display.readAndDispatch())
                          display.sleep();
                  }

              }

          }

          package net.blogjava.lzqdiy.tree;

          import java.util.List;

          public interface ITreeEntry
          {
             String getName();
             
          void setName(String name);
             
          void setChildren(List children);
             List getChildren();
          }

          package net.blogjava.lzqdiy.tree;

          import java.util.List;

          public class CityEntity implements ITreeEntry
          {
              
          public List getChildren()
              
          {
                  
          // TODO Auto-generated method stub
                  return null;
              }


              
          public void setChildren(List children)
              
          {
                  
          // TODO Auto-generated method stub
                  
              }

             
              
          private long id;

              String name;

              
          public long getId()
              
          {
                  
          return id;
              }


              
          public void setId(long id)
              
          {
                  
          this.id = id;
              }


              
          public String getName()
              
          {
                  
          return name;
              }


              
          public void setName(String name)
              
          {
                  
          this.name = name;
              }


              
          public CityEntity(String name)
              
          {
                  
          super();
                  
          this.name = name;
              }

          }

          package net.blogjava.lzqdiy.tree;

          import java.util.List;

          public class CountryEntity implements ITreeEntry
          {
              
          public List getChildren()
              
          {
                  
          // TODO Auto-generated method stub
                  return cities;
              }


              
          public void setChildren(List children)
              
          {
                  
          // TODO Auto-generated method stub
                  this.cities=children;
              }

              
              
          private Long id;

              
          private String name;

              
          private List cities;

              
          public List getCities()
              
          {
                  
          return cities;
              }


              
          public void setCities(List cities)
              
          {
                  
          this.cities = cities;
              }


              
          public Long getId()
              
          {
                  
          return id;
              }


              
          public void setId(Long id)
              
          {
                  
          this.id = id;
              }


              
          public String getName()
              
          {
                  
          return name;
              }


              
          public void setName(String name)
              
          {
                  
          this.name = name;
              }


              
          public CountryEntity(String name)
              
          {
                  
          super();
                  
          this.name = name;
              }

          }

          package net.blogjava.lzqdiy.tree;

          import java.util.ArrayList;
          import java.util.List;

          public class DataFactory
          {
              
          public static Object createTreeData()
              
          {
                  CityEntity city1 
          = new CityEntity("北京");
                  CityEntity city2 
          = new CityEntity("上海");
                  CityEntity city3 
          = new CityEntity("廣州");
                  CountryEntity country 
          = new CountryEntity("中國");
                  List cities 
          = new ArrayList();
                  cities.add(city1);
                  cities.add(city2);
                  cities.add(city3);
                  country.setChildren(cities);
                  List list 
          = new ArrayList();
                  list.add(country);
                  
          return list;
              }

          }

          運行效果:

          如果我只需要能畫出如上圖所示的一棵簡單樹,使用TreeViewer卻要寫如此多的代碼,實在是得不償失。這時使我想到了使用Swing中的JTree類。
          代碼如下:

          package net.blogjava.lzqdiy.tree;

          import javax.swing.JFrame;
          import javax.swing.JTree;
          import javax.swing.tree.DefaultMutableTreeNode;

          public class TreeTest2
          {

              
          private JTree tree;

              
          private JFrame frame;

              
          /**
               * Launch the application
               * 
               * 
          @param args
               
          */

              
          public static void main(String args[])
              
          {
                  
          try
                  
          {
                      TreeTest2 window 
          = new TreeTest2();
                      window.frame.setVisible(
          true);
                  }
           catch (Exception e)
                  
          {
                      e.printStackTrace();
                  }

              }


              
          /**
               * Create the application
               
          */

              
          public TreeTest2()
              
          {
                  initialize();
              }


              
          /**
               * Initialize the contents of the frame
               
          */

              
          private void initialize()
              
          {
                  frame 
          = new JFrame();
                  frame.getContentPane().setLayout(
          null);
                  frame.setBounds(
          100100400275);
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  DefaultMutableTreeNode country 
          = new DefaultMutableTreeNode("中國");
                  DefaultMutableTreeNode city1 
          = new DefaultMutableTreeNode("北京");
                  DefaultMutableTreeNode city2 
          = new DefaultMutableTreeNode("上海");
                  DefaultMutableTreeNode city3 
          = new DefaultMutableTreeNode("廣州");
                  country.add(city1);
                  country.add(city2);
                  country.add(city3);
                  tree 
          = new JTree(country);
                  tree.setBounds(
          11376222120);
                  frame.getContentPane().add(tree);
              }

          }

          運行效果:

          雖然代碼變少了,但是感覺用Swing畫出的樹又沒有SWT畫出的樹漂亮,最終我選擇了使用SWT中的Tree類來畫一棵簡單樹。
          代碼如下:

          package net.blogjava.lzqdiy.tree;

          import org.eclipse.swt.SWT;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Tree;
          import org.eclipse.swt.widgets.TreeItem;

          public class TreeTest3
          {

              
          private Tree tree;

              
          /**
               * Launch the application
               * 
               * 
          @param args
               
          */

              
          public static void main(String[] args)
              
          {
                  
          try
                  
          {
                      TreeTest3 window 
          = new TreeTest3();
                      window.open();
                  }
           catch (Exception e)
                  
          {
                      e.printStackTrace();
                  }

              }


              
          /**
               * Open the window
               
          */

              
          public void open()
              
          {
                  
          final Display display = Display.getDefault();
                  
          final Shell shell = new Shell();
                  shell.setSize(
          350250);
                  shell.setText(
          "SWT Application");
                  
          //

                  shell.open();

                  tree 
          = new Tree(shell, SWT.BORDER);
                  tree.setBounds(
          6539208121);
                  TreeItem country 
          = new TreeItem(tree, SWT.NONE);
                  country.setText(
          "中國");
                  TreeItem city1 
          = new TreeItem(country, SWT.NULL);
                  city1.setText(
          "北京");
                  TreeItem city2 
          = new TreeItem(country, SWT.NULL);
                  city2.setText(
          "上海");
                  TreeItem city3 
          = new TreeItem(country, SWT.NULL);
                  city3.setText(
          "廣州");
                  shell.layout();
                  
          while (!shell.isDisposed())
                  
          {
                      
          if (!display.readAndDispatch())
                          display.sleep();
                  }

              }

          }

          運行效果:

          又漂亮,代碼量又少,我喜歡,呵呵。

          posted on 2007-05-11 11:33 我為J狂 閱讀(2526) 評論(4)  編輯  收藏 所屬分類: 圖形用戶界面

          評論

          # re: 畫一棵簡單樹的三種方法 2007-05-11 18:11 Pande

          Tree只能處理String的對象,TreeViewer就要高級一點,如果你的Model本身就是樹形的,用ITreeContentProvider和LabelProvider還是很爽的,尤其是當你需要實現Lazy Load時。  回復  更多評論   

          # re: 畫一棵簡單樹的三種方法 2007-05-11 18:13 Pande

          >>但是感覺用Swing畫出的樹又沒有SWT畫出的樹漂亮<<

          我舉雙手贊同  回復  更多評論   

          # re: 畫一棵簡單樹的三種方法 2007-05-11 18:50 我為J狂

          @Pande
          謝謝您的高見,使我這個菜鳥受益匪淺。  回復  更多評論   

          # re: 畫一棵簡單樹的三種方法 2007-05-11 19:59 Pande

          @我為J狂
          不敢說是高見啊,我也還是個菜鳥啊。  回復  更多評論   

          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 梧州市| 锦州市| 彭泽县| 恭城| 德格县| 吉安市| 古田县| 勐海县| 同心县| 盖州市| 南漳县| 高台县| 宁波市| 钟祥市| 蓬莱市| 昌邑市| 利辛县| 白山市| 文水县| 阜新| 秀山| 灵山县| 若尔盖县| 广河县| 南丹县| 新建县| 高雄市| 南华县| 林西县| 通河县| 宝鸡市| 姜堰市| 南郑县| 翼城县| 陆川县| 名山县| 宜川县| 砚山县| 临猗县| 大连市| 繁昌县|