java - 为什么我们需要 JFace Viewer(特别是 TableViewers)的 ContentProvider?

标签 java eclipse swt jface tableviewer

我一直想知道为什么我们确实需要 JFace TableViewers 的 ContentProvider?我知道 ContentProvider 类的 getElements() 方法将返回一个数组或对象的集合 对应于表中的行,当我们在表上setInput(input) 时将调用getElements。但我的问题会更具体..

getElements 返回一个数组或对象集合,我可以编写自己的方法来返回一个对象数组,然后对表查看器的实例执行 setInput,对吗?

有人可以给我一个不太技术性但简短而令人满意的答案,说明我们为什么需要 ContentProvider 吗?如果没有 ContentProviders,如果我尝试在表格上设置输入,那么什么也不会显示。所以当涉及到 JFace 时,ContentProvider 和 LabelProvider 是必须的。

最佳答案

要让 JFace(表格)查看器正常工作,ContentProvider 和 LabelProvider 是必不可少的。

创建查看器时,默认的 LabelProvider(LabelProvider 的实例)已经设置。此实现使用 toString() 获取元素的文本表示。

需要显式设置 ContentProvider。它用于将应用程序域模型转换为查看器模型。在 TableViewer 的情况下,查看器期望应显示元素的平面数组。每个元素代表 TableViewer 的一行。

如果您的领域模型已经使用数组或集合,您可以使用预定义的 ArrayContentProvider

例如,要显示 Person 的列表,您可以像这样配置查看器:

Person[] persons = ...
viewer.setContentProvider( ArrayContentProvider.getInstance() );
viewer.setInput( persons );

假设人员保存在 PersonRegistry 中,您宁愿使用能够从注册表中提取人员的自定义 ContentProvider 配置查看器:

PersonRegistry registry = ...
viewer.setContentProvider( new PersonContentProvider() );
viewer.setInput( registry );

class PersonContentProvider implements IStructuredContentProvider {
  PersonRegistry registry;
  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    this.registry = ( PersonRegistry )newInput;
  }

  public Object[] getElements(Object inputElement) {
    return registry.getPersons();
  }

  ...
}

最后,setInput() 用于提供应用程序模型。 ContentProvider 的 inputChanged() 方法必须能够处理传递给 setInput() 的内容。另请注意,setInput() 只能在设置内容提供程序后调用,否则将抛出异常。

关于java - 为什么我们需要 JFace Viewer(特别是 TableViewers)的 ContentProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34509735/

相关文章:

java - 嵌入模式下的 h2 并发更新

java - 在java中嵌套XML标签时遇到问题

java - 为什么我的玩家会从平铺 map 中掉下来?

android - 如何从WebView调用youtube应用播放视频?

java - 我如何让 Twitter4J 流式传输带有特定主题标签的帖子?

eclipse - 如何在 Eclipse 中以编程方式在代码中插入行注释

eclipse - 如何为扩展 FormEditor 类的编辑器启用“保存”和“另存为”操作

java - 当我们在使用 swt 的 eclipse 插件开发中按下最大化按钮时,复合 Material 的宽度会发生变化

java - 如何将所有按钮放在同一行?

java - 比 WifiManager startScan() 更快的 WiFi 扫描替代方案?