jface

Eclipse JFace Viewers显示的模型元素有时需要花费大量时间来加载。 因此, 工作台提供了IDeferredWorkbenchAdapter类型以在后台获取此类模型元素。 不幸的是,似乎仅通过DeferredTreeContentManager派生的AbstractTreeViewer支持此机制。

因此,我开发了自己的通用DeferredContentManager …它可以为允许添加和删除模型元素的所有StructuredViewer类型进行后台加载。 在这篇文章中,我解释了它是如何工作的以及如何使用。

在需要(重新)使用TableViewer进行后台获取的情况下,我只发现了一个与此主题相关的旧的,尚未解决的平台错误 。 但是我怀疑问题所提议的为表查看器实现额外内容管理器的解决方案是否会非常明智。 因此,我决定尝试一个基于可用的树特定实现的概念的自制通用解决方案。

使用JFace Viewer延迟获取内容

在JFace Viewers中处理长加载模型元素的基本原理很简单。 与其直接在IContentProvider#getElements(Object)获取内容, IContentProvider#getElements(Object)数据检索委托给在后台作业中执行该操作的特定适配器。

此外,委托的getElements(Object)实现返回一个placeholder 。 只要发生数据加载,查看器就会显示出来。 同时,收集的数据将转发到更新作业 。 后者将元素附加到结构化查看器。 由于仅允许通过UI线程执行的代码进行SWT小部件访问,因此更新作业是UIJob

最后,在完成后台获取后,清理作业将删除占位符。

不应将延迟获取内容与使用SWT.VIRTUAL标志的元素的延迟加载相混淆。 尽管两种方法之间存在相似之处,但虚拟表和树通常可用于按需加载大型数据集。

延迟加载对于大小合理的数据集很有帮助,但是,数据集的检索可能很耗时,因此会阻塞UI线程。 例如,考虑获取远程数据。 万一您想知道,这两种方法当然是互斥的 ……

IDeferredWorkbenchAdapter

从开发人员的角度来看, IDeferredWorkbenchAdapter是必经之路。 它是IWorkbenchAdapter的扩展,通常负责“为工作台元素提供视觉表示和层次结构,使它们可以在UI中显示,而不必知道元素的具体类型”(如其javadoc所述) 。

该扩展声明了其他方法来支持延迟获取给定数据元素的子代,并且可以由适配器工厂进行注册。 考虑一个简单的pojo作为模型元素,例如:

public class ModelElement {[...]
}

为了从域类中抽象视觉呈现和后台加载,请提供适当的适配器实现…

public class ModelElementAdapterimplements IDeferredWorkbenchAdapter
{[...]
}

…并使用适配器工厂将这两种类型映射在一起:

public class ModelElementAdapterFactoryimplements IAdapterFactory
{@Overridepublic Object getAdapter( Object adaptableObject, Class adapterType ) {return new ModelElementAdapter();}@Overridepublic Class[] getAdapterList() {return new Class[] { ModelElement.class };}
}

有关使用IAdaptableIWorkbenchAdapterIAdaptableFactory更多信息,您可以看看如何使用IAdaptable和IAdapterFactory? 。 遗憾的是,默认工作台内容和标签提供程序希望模型元素实现IAdaptable 。 但是,可以使用自定义提供程序来规避此问题。

以下测试草图验证了元素适应是否按预期进行:

@Test
public void testAdapterRegistration() {IAdapterManager manager = Platform.getAdapterManager();ModelElementAdapterFactory factory = new ModelElementAdapterFactory();manager.registerAdapters( factory, ModelElement.class );Object actual = manager.getAdapter( new ModelElement(), ModelElement.class );assertThat( actual ).isInstanceOf( ModelElementAdapter.class );
}

现在该实现ModelElementAdapter的数据检索功能了。 这是通过fetchDeferredChildren方法完成的:

@Override
public void fetchDeferredChildren(Object parent, IElementCollector collector, IProgressMonitor monitor )
{collector.add( loadData( parent ), monitor );
}private Object[] loadData( Object parent ) {return [...]
}

费时的数据加载显然由loadData()方法处理。 将数据元素添加到IElementCollector会触发上述更新作业。 如您所见,可以通过几个步骤来划分数据获取,并且可以通过给定的IProgressMonitor报告进度。

DeferredContentManager

最后要做的是将本文中描述的机制与用于描述模型元素的查看器实例连接起来。 为此, DeferredContentManager可以调整任意查看器并将元素检索委托给相应的IDeferredWorkbenchAdapter实现。

class ModelElementContentProviderimplements IStructuredContentProvider
{DeferredContentManager manager;@Overridepublic void inputChanged(Viewer viewer, Object oldInput, Object newInput ){TableViewerAdapter adapter = new TableViewerAdapter( ( TableViewer )viewer );manager = new DeferredContentManager( adapter );}@Overridepublic Object[] getElements( Object inputElement )  {return manager.getChildren( inputElement );}[...]
}

自定义IStructuredContentProvider用于在其inputChanged方法中调整查看器。 getElements的实现将委托给内容管理器,后者再使用DeferredContentManager#getChildren将元素加载委托给模型元素适配器。

进行提取时,将返回一个占位符元素,以在查看器中显示“ Pending…”标签。 这是左侧标题图像中所示的情况。 在右侧,检索已完成,并且占位符已删除。

StructuredViewerAdapter

查看示例,可以清楚地了解DeferredContentManager如何支持不同的查看器类型。 内容管理器使用适当的派生StructuredViewerAdapter来修改查看器。 目前,只有用于抽象树形和表形查看器的默认适配器可用。

但是,直接为其他结构化查看器类型编写适配器是很容易的。 以下代码段显示了例如ListViewer的实现:

public class ListViewerAdapterextends StructuredViewerAdapter
{public ListViewerAdapter( AbstractListViewer listViewer ) {super( listViewer );}@Overridepublic void remove( Object element ) {viewer.remove( element );}@Overridepublic void addElements( Object parent, Object[] children ) {viewer.add( children );}
}

在示例中,使用此选项并将表查看器替换为列表查看器将导致以下结果:

凉! 是不是

结论

这篇文章介绍了DeferredContentManager并展示了它如何启用使用不同的JFace Viewer进行的模型元素的后台加载。 并且,在上面引人注目的用法解释之后,如果您可能想知道从哪里获得它,那么您将在Xiliary P2存储库中找到它。 内容管理器是com.codeaffine.eclipse.ui功能的一部分:

  • http://fappel.github.io/xiliary

如果您想查看代码或提出问题,也可以查看Xiliary GitHub项目:

  • https://github.com/fappel/xiliary

翻译自: https://www.javacodegeeks.com/2014/12/deferred-fetching-of-model-elements-with-jface-viewers.html

jface

jface_使用JFace Viewer延迟获取模型元素相关推荐

  1. 使用JFace Viewer延迟获取模型元素

    Eclipse JFace Viewers显示的模型元素有时需要花费大量时间来加载. 因此, 工作台提供了IDeferredWorkbenchAdapter类型以在后台获取此类模型元素. 不幸的是,似 ...

  2. 深入css布局 (1) — 盒模型 元素分类

    深入css布局(1)-- 盒模型 & 元素分类     " 在css知识体系中,除了css选择器,样式属性等基础知识外,css布局相关的知识才是css比较核心和重要的点.今天我们来深 ...

  3. 额外参数_Pytorch获取模型参数情况的方法

    分享人工智能技术干货,专注深度学习与计算机视觉领域! 相较于Tensorflow,Pytorch一开始就是以动态图构建神经网络图的,其获取模型参数的方法也比较容易,既可以根据其内建接口自己写代码获取模 ...

  4. web api、获取DOM元素的方式、事件理解、click事件在移动端300ms延时、事件对象、事件委托、常见事件类型

    web api: API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力 ...

  5. Knockout获取数组元素索引的2种方法,在MVC中实现

    在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespace UseIndex.Models {public class ...

  6. pytorch中获取模型参数

    原文链接:pytorch中获取模型参数:state_dict和parameters两个方法的差异比较_造未来-CSDN博客 一.本文的模型案例 代码如下: import torch import to ...

  7. vue 获取id元素_.vue组件中获取DOM元素问题

    一.问题引入 原项目把一块内容直接写在了模块中(浏览器显示的一整个页面),现在想把它提成一个单独组件,而且把其中使用document.getElementById('id')改为ref获取元素的形式. ...

  8. [转载] js 下获取子元素的方法 -- 李富生

    地址:https://www.cnblogs.com/web-fusheng/p/6816440.html firstElementChild只会获取元素节点对象,从名称就可以看出来,firstChi ...

  9. C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性

    系列目录     [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...

最新文章

  1. php thrift 报错,thrift安装遇到的问题以及解决方法(必看篇)
  2. [导入]利用PIL生成水印图片或文字
  3. BZOJ3336: Uva10572 Black and White(插头Dp)
  4. bzoj 1124 [POI2008]枪战Maf 贪心
  5. ASP.Net导出EXCEL表(小结)
  6. this.scrollheight获取textarea的高度是0_【2019年14卷3期】UHF传感器固定角度和加装屏蔽罩对有效高度的影响丨电气工程学报文章推荐...
  7. Delphi2010中向TRxRichEdit控件中插入OLE对象。
  8. [转] 丢了自己,要记得找回了~~我们80后的那些忧伤
  9. 归并排序java代码实现
  10. redis 40道面试题
  11. C语言实现循环缓冲fifo及总结
  12. NX文件名与工程图名自动关联
  13. android dialog edittext 弹出软件盘,http://gogo.com-官方网站
  14. JavaSrcipt学习(学习打卡Day8)
  15. 如何防止驱动被恶意利用
  16. 2017-2018-1 20155228 《信息安全系统设计基础》第三周学习总结
  17. gitlab镜像仓库设置及自动同步代码到服务器实现方式
  18. 英国AI研究员揭开真相,中国人工智能为何能发展迅速?
  19. linux电子词典项目流程,毕业设计_linux下电子词典的设计与实现.doc
  20. Windows 11家庭版

热门文章

  1. jzoj3410-[GDOI2014模拟]Tree【最小生成树,贪心】
  2. P1236-Network of Schools(学校网络)【最强联通块,Kosaraju】
  3. 【线段树】Optimal Insertion(CF751E)
  4. 【最短路】【图论】【Floyed】牛的旅行(ssl 1119/luogu 1522)
  5. 【动态规划】农田个数 (ssl 1633)
  6. 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C
  7. 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python
  8. Java多线程:实现方式Thread与Runnable
  9. 越优秀的人越努力,越努力的人越幸运!
  10. Echarts五步法加初体验