Eclipse下的開發(fā)因為是插件化的,所以一切都要盡可能的實行標(biāo)準(zhǔn),而不是直接操作底層,就Tree來說,就需要使用TreeViewer,而不是Tree,但是使用封裝后的組件往往有一些自定義的目標(biāo)做不到,比如對一個TreeViewer setInput之后,因為input Model的改變,TreeViewer要對每個節(jié)點的路徑進行計算,如果得到的element和原來的不一樣,就會進行路徑更新,放棄原有的路徑。而Tree是一個多級化的組件,有折疊的狀態(tài)存在,每一個TreeItem可以擁有自己的子節(jié)點。如果直接使用TreeViewer,然后想對TreeViewer的Tree直接進行操作實際上是不可能的。TreeViewer的節(jié)點是通過ContentProvider動態(tài)拿到的,所以當(dāng)我們想直接操作某一個節(jié)點,比如想讓它展開,或者獲得它的子節(jié)點數(shù)目的時候,得到的結(jié)果都會和預(yù)期結(jié)果完全不一樣,因為那個時候TreeItem的子節(jié)點并沒有被自動創(chuàng)建。
那么如何對一個TreeViewer的TreeItem進行操作呢?通過以上的分析得知,我們首先要創(chuàng)建出該節(jié)點的子節(jié)點才行。TreeViewer里有一個方法:protected void createChildren(Widget widget),該方法是用來創(chuàng)建TreeItem的子節(jié)點的,可以看到它是一個protected方法,不允許外界訪問的。我們可以在需要用到TreeViewer的地方,自己繼承TreeViewer,覆寫createChildren方法,把protected改成public。然后通過這個CustromTreeViewer,就可以自由控制子節(jié)點了。凡是我們需要操作TreeItem的地方,首先createChildren(item),然后item.setExpanded(true)或者item.getItems[]都可以正常使用了。
一般來說,當(dāng)需要記錄和恢復(fù)一個TreeViewer的狀態(tài)的時候,這個方法就會顯得非常有用處。