如何在使用eclipse数据绑定时处理java.util.Properties

时间:2013-01-13 02:36:43

标签: eclipse swt eclipse-rcp jface

我有一个模型类,它包含一个java.util.Properties。

public class Model{
    private Properties properties;
}

此属性可以包含任意键值对。现在我想将“属性”绑定到JFace TableViewer。怎么做?

一些示例代码会很好,我已经用Google搜索了,但没有发现任何有用的内容。

1 个答案:

答案 0 :(得分:1)

要从TableViewer访问您的模型,您必须提供LabelProvider和ContentProvider作为TableViewer的转换,当然还要提供模型本身。

简而言之,ContentProvider将模型内容包装到TableViewer的结构中(基本上是模型细分为TableViewer的逐行方法)。

LabelProvider允许您控制TableCells中的实际渲染。

为了提供模型,TableViewer提供了一个setInput方法。 但是,当您的模型建模为JavaBean时,这种方法效果最佳。

如果您查看这些代码段,您会在ContentProvider的实现中找到类似这样的内容,例如here

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());