昨天(2005-12-16 20:20)給遠方的她打了一個電話。當時她還在回家的路上。隨便聊了一些東西。挺happy。
RCP學習筆記(一) Viewer合作類的模式 Viewer是邏輯對象(或叫做領域模型)和顯示對象之間的一個橋梁。他的主要的任務就是根據邏輯對象來填充窗體組件。一般需要三個類來完成Business Object 在窗體組件中的顯示。我們這里同過使用TableView來演示這部分的功能。 TableViewer的責任是用特定的對象填充到Table窗體組件中。是我們最終在窗體要看到的對象。如下圖所示的一部分:![]() 而IStructuredContentProvider和ITableLabelProvider的實現類是用來幫助TableViewer來完成這個任務的。 1、 IStructuredContentProvider的任務是“根據給定的對象,返回一個對應的領域對象”1。是通過:public Object[] getElements(Object arg0)2方法實現的。 2、 ITableLabelProvider 的任務是“返回展現領域對象的所需的圖標和文字”。這兩個任務分別是通過public Image getColumnImage(Object element, int columnIndex);和 public String getColumnText(Object element, int columnIndex);這兩個方法實現的。他們的傳入參數都是:Object element, int columnIndex。Element表示當前行所要展現的數據對象,columnIndex表示的當前處理的列號,他是從零開始記的。 知道了他們之間分配的職能后,我們就可以看看他們是怎么協作的了。在TableView的需要顯示的輸入對象改變了(調用了setInput方法可以觸發待顯示領域對象的改變),這就會觸發TableView的InputChange事件,這時候TableView就會去調用他本身的refresh3方法。最終會在getRawChildren方法中調用IStructuredContentProvider實現類中的getElements方法或的一個Object[]。供以后創建Item時使用。整個調用過程可以用下面的strack圖來表示:![]() 通過調用IStructuredContentProvider獲的了一個對象數組后,就會根據對象數組來創建顯示的Item。我們可以先看一下ITableLabelProvider(TableLabelProvider是ITableLabelProvider的一個實現類)。 ![]() 在更新Item的時候提供每個TableView需要的Text和Image就好了。他們最終在TableViewer的doUpdateItem方法中調用ITableLabelProvider的getColumnText和getColumnImage方法。 下面是我示例中的代碼: TableLabelPrivate:![]() TableContentPrivate: ![]() Viewer也都是采用ContentProvide和LabelProvide的協作方式來工作。 其他的 參考文獻: 1、 Contributing to Eclipse 中文版 Page 290 2、 org.eclipse.jface.viewers. IStructuredContentProvider.java 3、 這個方法繼承自StructuredViewer。可參考StructuredViewer.java |