为什么我们需要为JFace Viewers提供ContentProviders(特别是TableViewers)?

时间:2015-12-29 11:09:05

标签: java eclipse swt jface tableviewer

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

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

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

2 个答案:

答案 0 :(得分:4)

要使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()必须仅在设置内容提供程序后调用,否则将引发异常。

答案 1 :(得分:0)

如果你有一个数组输入,只需设置一个org.eclipse.jface.viewers.ArrayContentProvider。 http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjface%2Fviewers%2FArrayContentProvider.html

表和树可以具有不同的输入,例如XML内容或数据库结果,内容提供者为表准备内容。

编辑:Lars Vogel在他的教程中写道:
与其他JFace查看器一样,内容提供程序提供应在TableViewer中显示的数据。

Eclipse通过ArrayContentProvider类提供此接口的实现。 ArrayContentProvider类支持Arrays或Collections作为输入,包含域数据。您可以通过从org.eclipse.jface.viewers包中实现接口IStructuredContentProvider来为表实现自己的内容提供程序。

内容提供程序的getElements()方法用于将查看器的输入转换为元素数组。一旦调用了查看器上的setInput()方法,它就会使用内容提供程序对其进行转换。这就是为什么必须在调用setInput()方法之前设置内容提供程序的原因。

内容提供程序返回的Array中的每个对象都由查看器显示为单独的元素。在表查看器的情况下,每个对象显示在单独的行中。 http://www.vogella.com/tutorials/EclipseJFaceTable/article.html