为什么我们需要 JFace Viewer(特别是 TableViewers)的 ContentProvider?
Why do we need ContentProviders for JFace Viewers (TableViewers specifically)?
我一直想知道为什么我们确实需要 JFace TableViewers 的 ContentProvider?我知道 getElements() 方法 ContentProvider class 将 return 对象的 数组或集合 对应于 table 和 getElements 上的行当我们 setInput(input)
在 table 上时将被调用。但我的问题会更具体..
getElements
returns 对象数组或集合,相反,我可以将自己的方法写入 return 对象数组,然后在 table 观众的实例对吗?
有人可以给我一个不太技术性但简短而令人满意的答案,说明我们为什么需要 ContentProvider 吗?如果没有 ContentProviders,如果我尝试在 table 上设置输入,那么什么也不会显示。所以当涉及到 JFace 时,ContentProvider 和 LabelProvider 是必须的..
如果您有数组输入,只需设置 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 内容或数据库结果,内容提供者为 table 准备内容。
编辑:Lars Vogel 在他的教程中写道:
与其他 JFace 查看器一样,内容提供程序提供应在 TableViewer 中显示的数据。
Eclipse 通过 ArrayContentProvider class 提供此接口的实现。 ArrayContentProvider class 支持数组或集合作为输入,包含域数据。您可以通过实现 org.eclipse.jface.viewers 包中的接口 IStructuredContentProvider 来为 table 实现自己的内容提供程序。
内容提供者的 getElements() 方法用于将查看者的输入转换为元素数组。一旦调用了查看器上的 setInput() 方法,它就会使用内容提供程序对其进行转换。这就是为什么必须在调用 setInput() 方法之前设置内容提供程序的原因。
内容提供者返回的数组中的每个对象在查看器中显示为单独的元素。在 table 查看器的情况下,每个对象都显示在单独的行中。
http://www.vogella.com/tutorials/EclipseJFaceTable/article.html
要使 JFace (table) 查看器正常工作,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()
只能在设置内容提供程序后调用,否则将抛出异常。
我一直想知道为什么我们确实需要 JFace TableViewers 的 ContentProvider?我知道 getElements() 方法 ContentProvider class 将 return 对象的 数组或集合 对应于 table 和 getElements 上的行当我们 setInput(input)
在 table 上时将被调用。但我的问题会更具体..
getElements
returns 对象数组或集合,相反,我可以将自己的方法写入 return 对象数组,然后在 table 观众的实例对吗?
有人可以给我一个不太技术性但简短而令人满意的答案,说明我们为什么需要 ContentProvider 吗?如果没有 ContentProviders,如果我尝试在 table 上设置输入,那么什么也不会显示。所以当涉及到 JFace 时,ContentProvider 和 LabelProvider 是必须的..
如果您有数组输入,只需设置 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 内容或数据库结果,内容提供者为 table 准备内容。
编辑:Lars Vogel 在他的教程中写道:
与其他 JFace 查看器一样,内容提供程序提供应在 TableViewer 中显示的数据。
Eclipse 通过 ArrayContentProvider class 提供此接口的实现。 ArrayContentProvider class 支持数组或集合作为输入,包含域数据。您可以通过实现 org.eclipse.jface.viewers 包中的接口 IStructuredContentProvider 来为 table 实现自己的内容提供程序。
内容提供者的 getElements() 方法用于将查看者的输入转换为元素数组。一旦调用了查看器上的 setInput() 方法,它就会使用内容提供程序对其进行转换。这就是为什么必须在调用 setInput() 方法之前设置内容提供程序的原因。
内容提供者返回的数组中的每个对象在查看器中显示为单独的元素。在 table 查看器的情况下,每个对象都显示在单独的行中。 http://www.vogella.com/tutorials/EclipseJFaceTable/article.html
要使 JFace (table) 查看器正常工作,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()
只能在设置内容提供程序后调用,否则将抛出异常。