RCP學(xué)習(xí)筆記(一) Viewer合作類的模式
Viewer是邏輯對(duì)象(或叫做領(lǐng)域模型)和顯示對(duì)象之間的一個(gè)橋梁。他的主要的任務(wù)就是根據(jù)邏輯對(duì)象來(lái)填充窗體組件。一般需要三個(gè)類來(lái)完成Business Object 在窗體組件中的顯示。我們這里同過(guò)使用TableView來(lái)演示這部分的功能。
TableViewer的責(zé)任是用特定的對(duì)象填充到Table窗體組件中。是我們最終在窗體要看到的對(duì)象。如下圖所示的一部分:

而IStructuredContentProvider和ITableLabelProvider的實(shí)現(xiàn)類是用來(lái)幫助TableViewer來(lái)完成這個(gè)任務(wù)的。
1、 IStructuredContentProvider的任務(wù)是“根據(jù)給定的對(duì)象,返回一個(gè)對(duì)應(yīng)的領(lǐng)域?qū)ο蟆?/span>1。是通過(guò):public Object[] getElements(Object arg0)2方法實(shí)現(xiàn)的。
2、 ITableLabelProvider 的任務(wù)是“返回展現(xiàn)領(lǐng)域?qū)ο蟮乃璧膱D標(biāo)和文字”。這兩個(gè)任務(wù)分別是通過(guò)public Image getColumnImage(Object element, int columnIndex);和
public String
getColumnText(Object element, int columnIndex);這兩個(gè)方法實(shí)現(xiàn)的。他們的傳入?yún)?shù)都是:Object element, int columnIndex。Element表示當(dāng)前行所要展現(xiàn)的數(shù)據(jù)對(duì)象,columnIndex表示的當(dāng)前處理的列號(hào),他是從零開始記的。
知道了他們之間分配的職能后,我們就可以看看他們是怎么協(xié)作的了。在TableView的需要顯示的輸入對(duì)象改變了(調(diào)用了setInput方法可以觸發(fā)待顯示領(lǐng)域?qū)ο蟮母淖儯@就會(huì)觸發(fā)TableView的InputChange事件,這時(shí)候TableView就會(huì)去調(diào)用他本身的refresh3方法。最終會(huì)在getRawChildren方法中調(diào)用IStructuredContentProvider實(shí)現(xiàn)類中的getElements方法或的一個(gè)Object[]。供以后創(chuàng)建Item時(shí)使用。整個(gè)調(diào)用過(guò)程可以用下面的strack圖來(lái)表示:

通過(guò)調(diào)用IStructuredContentProvider獲的了一個(gè)對(duì)象數(shù)組后,就會(huì)根據(jù)對(duì)象數(shù)組來(lái)創(chuàng)建顯示的Item。我們可以先看一下ITableLabelProvider(TableLabelProvider是ITableLabelProvider的一個(gè)實(shí)現(xiàn)類)。
在更新Item的時(shí)候提供每個(gè)TableView需要的Text和Image就好了。他們最終在TableViewer的doUpdateItem方法中調(diào)用ITableLabelProvider的getColumnText和getColumnImage方法。
要實(shí)現(xiàn)一個(gè)在TableView中顯示特定對(duì)象只需要實(shí)現(xiàn)IStructuredContentProvider實(shí)現(xiàn)類的getElements方法。和ITableLabelProvider的getColumnText方法。
下面是我示例中的代碼:
TableLabelPrivate:
TableContentPrivate:

Viewer也都是采用ContentProvide和LabelProvide的協(xié)作方式來(lái)工作。
其他的
參考文獻(xiàn):
1、 Contributing to Eclipse 中文版 Page 290
2、 org.eclipse.jface.viewers. IStructuredContentProvider.java
3、 這個(gè)方法繼承自StructuredViewer。可參考StructuredViewer.java