天天看點

Eclipse中的TreeViewer類和ListViewer類

TreeViewer和TableViewer在使用上還是有很多相似之處.TreeViewer中冶有TableViewer中的過濾器和排序器.具體使用看TableViewer中的使用.

和Table有JFace的擴充TableViewer一樣,Tree也有一個JFace中的擴充,那就是TreeViewer.因為TreeViewer和TableViewer繼承自同一個父類StructuredViewer是以兩者有很多方法的使用是一樣的.例如:都使用setInput方法輸入資料,都有内容器,标簽器,以及排序器,過濾器等.

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

建立一個樹節點的接口類:

樹節點由兩個基本特征,名稱和子節點.這裡把這兩個特征抽象出來寫成一個接口,然後将要做樹節點的實體類實作此接口.

主義這個接口不是必須的.僅僅是為了今後操作友善,以及規範化涉及才建立的.

但是每個實體對應的都是樹上的一個節點.這裡定義一個樹中節點的通用接口.

然後每個實體類都實作這個接口.

接着建立幾個實體類:

ITreeEntry.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

City.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

Country.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

People.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

制造各個實體類的工具類

DataFactory.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

内容器:TreeViewerContentProvider.java

标簽器還比較簡單,在TreeViewer中最主要和最複雜的是内容器,熟悉内容器是掌握TreeViewer的要點.

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

程式說明:在内容器中最關鍵的是getElements,hasChildren,getChildren這三個方法.

1.getElements自在顯示"第一級"結點的時候才會被執行.

2.hasChildren主要用于判斷目前說系那是的節點是否有子節點,如果有子節點則前面顯示一個"+"号圖示,而有"+"号的結點則可以單擊展開其下一級的子節點.

3.當單擊右"子"的結點的時候,才會執行getChildren方法.展開其子節點後,又會對子節點執行一遍hasChildren方法,以決定其各子結點前是否顯示"+"圖示.

下面是"内容器"在啟動,單擊,關閉視窗時執行的過程.

Eclipse中的TreeViewer類和ListViewer類

下面以本例來解釋這個圖:

1.樹界面啟動的時候 ,先執行inputChanged()方法,接着執行getElements方法,其inputElement參數就是由setInput傳入的對象:包含所有實體對象的List,此List在getElements中被轉化成一個數組,數組包含第一級結點的兩個元素,中國,美國,日本,他們将首先顯示在頁面上.接下來執行三次hasChildren方法,判斷中國,日本和美國是否有子節點.他們都有子節點.,是以方法傳回True,兩結點前都顯示"+"圖示.

2.單擊右子節點的中國:先執行一次getChildren方法,方法的parentElement參數就是中國結點對象.方法中把中國的子節點取出轉換陳給一個數組傳回,此數組包含3個元素"北京,上海,濟南".接下來連續執行3次hasChildren方法來判斷"北京,上海,濟南"是否有子節點,如果有在結點的前面顯示一個"+"圖示.

3.單擊沒有子節點的結點:不會有執行内容器中的任何方法.

4.關閉視窗:會先後執行inputChanged和dispose方法.

标簽器TreeViewerLableProvider.java

将标簽器寫成單獨的外部類,以便于後面的執行個體共用,其代碼如下,在getText方法中element的類型可以是國家,城市,人,由于他們都是屬于一個接口,是以getText的代碼簡潔不少.getImage()的實作參考TableViewer的标簽器.

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

給TreeViewer加上右鍵菜單的方法和TableViewer相似,也要用到Action,ActionGroup,MenuManager類.當然程式要根據樹的特點稍作改動.

MyActionGroup内含有各Action類,在實作Action時,對傳入的結點對象要記得進行空值判斷.因為TreeViewer的大部分方法都不支援空值參數.會導緻異常并中斷程式.

MyActionGroup.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

TreeViewer.java的執行個體

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

TreeViewer1.java的運作結果圖

Eclipse中的TreeViewer類和ListViewer類

TreeViewer2.java

Eclipse中的TreeViewer類和ListViewer類
Eclipse中的TreeViewer類和ListViewer類

TreeViewer2.java的運作結果圖:

Eclipse中的TreeViewer類和ListViewer類

 上面的這個是<<Eclispe從入門到精通>>中第一版的代碼,在第二版中對一些功能進行了一些改進.

該進在于"不同的結點顯示不同的菜單".

樹的"人"結點是沒有子節點的.是以對于"人"這個節點來說,右鍵菜單中的"展開,收縮,增加"菜單項都沒有任何意義,應該隐藏起來,再根據目前節點的類型決定要将哪些Action加入菜單中.按着這個思路将MyActionGroup類的fillContextMenu方法修改如下:

本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/4178096.html,如需轉載請自行聯系原作者