我有一个模型类,它包含一个 java.util.Properties。
public class Model{
private Properties properties;
}
此属性可以包含任意键值对。现在我想将“属性”绑定到 JFace TableViewer。这个怎么做?
一些示例代码会很好,我已经用谷歌搜索过,但没有发现任何有用的东西。
我有一个模型类,它包含一个 java.util.Properties。
public class Model{
private Properties properties;
}
此属性可以包含任意键值对。现在我想将“属性”绑定到 JFace TableViewer。这个怎么做?
一些示例代码会很好,我已经用谷歌搜索过,但没有发现任何有用的东西。
要从 TableViewer 访问您的模型,您必须提供 LabelProvider 和 ContentProvider 作为 TableViewer 的翻译,当然还要提供模型本身。
简而言之,ContentProvider 将您的模型内容包装到 TableViewer 的结构中(基本上是将您的模型分解为 TableViewer 的逐行方法)。
LabelProvider 允许您控制 TableCells 中的实际呈现。
为了提供您的模型,TableViewer 提供了一个 setInput 方法。但是,当您的模型被建模为 JavaBean 时,这种方法效果最好。
如果您查看这些片段,您会在 ContentProvider 的实现中找到类似的内容,如下所示:
public Object[] getElements(Object inputElement) {
return (MyModel[]) inputElement;
}
因此,如果我现在理解的您的模型只是您的属性的包装器,那么实现您的目标的一种方法是引入PropertyLine的概念,该概念可以通过启动或通过 JFace 数据绑定动态填充(可能是一个不同的主题)。
public class Model{
...
private PropertyLine[] propertyLineArray;
private PropertyLine[] initializeProperties(){
//initialize your PropertyLines
}
public Model(){
...
propertyLineArray=initializeProperties();
...
}
public PropertyLine[] getPropertyLines(){
return propertyLineArray;
}
}
public class ProperyLine{
...
private String propertyKey;
private String propertyText;
//getter, setter
...
}
您的 ContentProvider 看起来像这样:
private class PropertyContentProvider implements IStructuredContentProvider {
...
public Object[] getElements(Object inputElement) {
return (PropertyLine[]) inputElement;
}
...
}
你的 LabelProvider 看起来很简单:
public class PropertyLabelProvider extends LabelProvider implements
ITableLabelProvider {
...
public String getColumnText(Object element, int columnIndex) {
PropertyLine pl=(PropertyLine) element
return pl.getPropertyText();
}
...
}
您可以通过以下方式将所有内容连接起来:
final TableViewer v = new TableViewer(shell, SWT.BORDER
| SWT.FULL_SELECTION);
v.setLabelProvider(new PropertyLabelProvider());
v.setContentProvider(new PropertyContentProvider ());
v.setInput(myModel.getPropertyLines());