我一直想知道为什么我们确实需要 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/