我一直想知道为什么我们需要为JFace TableViewers提供ContentProviders?我知道 ContentProvider 类的 getElements() 方法将返回 数组或当我们setInput(input)
在表上时,将调用与表上的行和getElements对应的对象的集合 。但我的问题会更具体......
getElements
返回一个数组或对象集合,而我可以编写自己的方法来返回一个对象数组,然后在表查看器的实例上执行setInput吗?
有人可以给我一个不太技术但是简短而令人满意的答案,为什么我们需要ContentProviders?没有ContentProviders,如果我尝试在表上设置输入,那么什么都没有显示..所以当谈到JFace时,ContentProvider和LabelProvider是必须的..
答案 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