我一直想知道为什么我们为JFace TableViewers确实需要ContentProviders?我知道 ContentProvider 类的 getElements()方法将返回与表中的行相对应的Object的数组或Collection ,并且当我们在表上进行setInput(input)时将调用getElements。但是我的问题会更具体。
getElements返回对象的数组或集合,相反,我可以编写自己的方法以返回对象的数组,然后对表查看器的实例执行setInput吗?

有人可以给我一个不太技术但简短而令人满意的答案,说明为什么我们确实需要ContentProviders吗?没有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配置查看器,该自定义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(),否则将引发异常。

07-24 15:28