API UI JDT предоставляет классы, позволяющие представить модель Java или ее компоненты в стандартном средстве отображения JFace. Эта функциональность обеспечивается в основном следующими элементами:
Поставщики содержимого и меток для средств отображения 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, IPackageFragment и IFolder:
JavaElementImageDescriptor может использоваться для создания изображения на основе произвольного описателя базового изображения и набора флагов, указывающих, какие специальные украшения Java (например, static, final, synchronized, ....) должны накладываться на изображение.
... DecoratingLabelProvider decorator= new DecoratingLabelProvider(labelProvider, new ProblemsLabelDecorator()); viewer.setLabelProvider(decorator); ...
Точно так же класс OverrideIndicatorLabelDecorator позволяет добавить в обычный поставщик меток индикаторы реализации и переопределения для методов.
Ни OverrideIndicatorLabelDecorator , ни ProblemsLabelDecorator не оповещаются об изменениях модели. Следовательно, при изменениях модели Java или маркеров ресурсов представление средства отображения не обновляется. Причина, по которой ответственность за обновление средства отображения перекладывается на клиента, заключается в том, что все еще не существует общей реализации, производительность которой удовлетворяла бы всем предъявляемым требованиям. Выполнение проверки дерева изменений модели Java и обновления средства отображения в каждом средстве оформления или поставщике меток может привести к возрастанию количества проверок дерева изменений и ненужным обновлениям средства отображения.
Что в таком случае должен делать клиент для обновления своих средств отображения?
ProblemTreeViewer.handleLabelProviderChanged
внутренних классов.По тем же причинам, что и для средств оформления меток, класс StandardJavaElementContentProvider также не получает уведомлений об изменениях модели. Если необходимо, чтобы представление средства отображения обновлялось в соответствии с изменениями в модели Java, то клиент должен добавить в JavaCore соответствующий приемник. Если изменение, описанное деревом изменений, делает недействительной структуру элементов, представленных в средстве отображения, то клиент должен обновлять средство отображения с помощью стандартного API JFace (см. описание методов обновления для класса StructuredViewer, а также методов добавления и удаления для TableViewer и AbstractTreeViewer).
Для сортировки элементов Java в соответствии со стилем сортировки UI Java, в средство отображения JFace можно добавить JavaElementSorter.