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

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

如果需要提供給 JFace 檢視器的內容和標籤的詳細說明,請參閱 JFace 檢視器

如果您瞭解基本平台機制,將 Java 內容和標籤提供者放在一起是相當簡單:
    ...
	TreeViewer viewer= new TreeViewer(parent);     // 提供編譯單元或類別檔的成員,但沒有工作副本元素
    ITreeContentProvider contentProvider= new StandardJavaElementContentProvider(true, false);
    viewer.setContentProvider(contentProvider);
    // 有更多的旗標定義在 JavaElementLabelProvider 類別中
    ILabelProvider labelProvider= new JavaElementLabelProvider(
        JavaElementLabelProvider.SHOW_DEFAULT |
        JavaElementLabelProvider.SHOW_QUALIFIED |
        JavaElementLabelProvider.SHOW_ROOT);
    viewer.setLabelProvider(labelProvider);
    // 使用 Java 模型作為在第一層呈現 Java 專案的檢視器輸入。
    viewer.setInput(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()));
    ...

上述的範例使用 Java 模型 (IJavaModel) 作為檢視器的輸入元素。 StandardJavaElementContentProvider 也支援 IJavaProject IPackageFragmentRoot IPackageFragmentIFolder 作為輸入元素:

以 Java 資訊覆蓋影像

JavaElementImageDescriptor 可用來建立一個以任意基本影像描述子為基礎的影像: 而且有一組指定 Java 特定修飾(如,static、final、synchronized)的旗標將加在影像之上。

新增問題與置換裝飾元

當檢視器被認定為含有問題附註時,JFace DecoratingLabelProvider 會結合 ProblemsLabelDecorator 一起使用。下列的片段說明如何使用問題標籤裝飾元。
    ...
	DecoratingLabelProvider decorator= new DecoratingLabelProvider(labelProvider, new ProblemsLabelDecorator());	    viewer.setLabelProvider(decorator);
    ...

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

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

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

因此如果用戶端要更新其檢視器,則必須執行哪些?

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

排序檢視器

JavaElementSorter 可插入到 JFace 檢視器中,以根據 Java UI 的排序樣式來排序 Java 元素。