我一直想知道为什么我们为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()
,否则将引发异常。