如何在標準 JFace 檢視器中呈現 Java 元素

JDT-UI API 提供一些類別,可讓您在標準 JFace 檢視器中呈現 Java 模型或其中的某些部份。此功能主要是由下列提供:

將這些片段放在一起的方法很簡單:
	...
IJavaProject jProject= ...;

TreeViewer viewer= new TreeViewer(parent);
// Provide members of a compilation unit or class file, but no working copy elements
ITreeContentProvider contentProvider= new StandardJavaElementContentProvider(true, false);
viewer.setContentProvider(contentProvider);
// There are more flags defined in class JavaElementLabelProvider
ILabelProvider labelProvider= new JavaElementLabelProvider(
JavaElementLabelProvider.SHOW_DEFAULT |
JavaElementLabelProvider.SHOW_QUALIFIED |
JavaElementLabelProvider.SHOW_ROOT);
viewer.setLabelProvider(labelProvider);

// Using the Java model as the viewers input present Java projects on the first level.
viewer.setInput(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()));
...

除了 Java 模型外,StandardJavaElementContentProvider 類別還支援下列的輸入元素類型:IJavaProjectIPackageFragmentRootIPackageFragmentIFolder

新增問題與置換 Decorator

當檢視器被認定為含有問題附註時,則會使用 DecoratingLabelProvider 與 ProblemsLabelDecorator。以下的程式碼片段是說明問題標籤 Decorator 的用法:
	...
DecoratingLabelProvider decorator= new DecoratingLabelProvider(labelProvider, new ProblemsLabelDecorator());
viewer.setLabelProvider(decorator);
...


同樣地, OverrideIndicatorLabelDecorator 可用來裝飾一般的標籤提供者, 以顯示方法的實作與置換指示器。

當模型變更時即更新呈現內容

OverrideIndicatorLabelDecorator ProblemsLabelDecorator 皆不會接聽模型的變更。因此,當 Java 或資源標示元模型有變更時, 檢視器並不會更新其呈現內容。 之所以將更新動作推給這些類別的用戶端, 是因為沒有一種通用的實作方式,可關注到所有效能問題。 當處理 Java 模型數據的視察以及會在每個標籤 Decorator 或提供者中重新整理的檢視器時, 會導致視察多項數據,以及不必要的檢視器更新。

因此如果用戶端要更新其檢視器,則必須執行哪些?
由於標籤 Decorator 存在同樣原因, StandardJavaElementContentProvider 不會接聽模型的變更。如果檢視器必須隨 Java 模型的變更而更新其呈現內容, 則用戶端應新增對應的接聽器到 JavaCore 中。如果數據所說明的變更讓檢視器中所呈現的元素結構失效, 則用戶端應使用標準 JFace API 更新檢視器(請參閱 StructuredViewer 中的 refresh 方法, 以及 TableViewer 與 AbstractTreeViewer 中的 add 與 remove 方法)。

Copyright IBM Corporation and others 2000, 2002. All Rights Reserved.