PropertyAccess:有没有办法动态创建访问功能?

时间:2013-03-23 17:34:39

标签: java gwt extjs

这是事情..我想在网站的某些图表中绘制一些线条。 这些图表有时会有一两行...但有时会有一些更多,其中每一行都是由任意数学函数定义的。

至于现在,我只知道这种可能性。三行:

public class ArbitraryFunctionData {

  private double x1;
  private double x2;
  private double x3;
  private double y;

  public ArbitraryFunctionData(double x1, doouble x2, double x3, double y) {
    this.x1 = x1;
    this.x2 = x2;
    this.x3 = x3;
    this.y = y;
  }

  public double getX1() {
    return x1;
  }

  public double getX2() {
    return x2;
  }

  public double getX3() {
    return x3;
  }

  public double getY() {
    return y;
  }

  public void setX1(double x1) {
    this.x1 = x1;
  }

  public void setX2(double x2) {
    this.x2 = x2;
  }

  public void setX3(double x3) {
    this.x3 = x3;
  }

  public void setY(double y) {
    this.y = y;
  }
}

某处需要定义此界面:

  public interface ArbitraryFunctionAccess extends
      PropertyAccess<ArbitraryFunctionData> {

    ValueProvider<ArbitraryFunctionData, Double> x1();
    ValueProvider<ArbitraryFunctionData, Double> x2();
    ValueProvider<ArbitraryFunctionData, Double> x3();

    @Path("x")
    ModelKeyProvider<ArbitraryFunctionData> xKey();
  }

所以我可以将这些访问功能作为字段添加到图表中:

horizontalAxis.addField(arbFuncAccess.x1());
horizontalAxis.addField(arbFuncAccess.x2());
horizontalAxis.addField(arbFuncAccess.x3());

这是创建图表的一种非常不舒服的方式。有没有更好的方法来做到这一点? ArbitraryFunctionData需要预先定义,并且需要手动添加每个访问方法。我宁愿做那样的事情:

ArbitraryFunction f1 = new ArbitraryFunction(0, 5, 0, 5) {

  @Override
  public double f(double x) {
    return x+1;
  }

};

ArbitraryFunction f2 = new ArbitraryFunction(0, 5, 0, 5) {

  @Override
  public double f(double x) {
    return x+2;
  }

};

store.add(0, f1.getData()); // a line
store.add(1, f2.getData()); // another line

其中需要覆盖ArbitraryFunctions函数public double f(double x),并将ArbitraryFunction.getData()定义为public List<ArbitraryFunctionData> getData()。这会增加整个事物的动态,但问题是,我无法将字段添加到图表中,因为它们需要在public interface ArbitraryFunctionAccess中预先定义。

我希望我能正确描述我的需要。有谁知道这可能的解决方案?

1 个答案:

答案 0 :(得分:1)

PropertyAccess不是重点 - ValueProviderPropertyAccess类型只是一种自动生成一堆非常无聊的ValueProvider / ModelKeyProvider / LabelProvider类型的好方法,您可以轻松地手动执行这些类型。你的时间很宝贵,所以我们不会让你手工完成。

这意味着您可以制作ValueProvider的手工制作实现,它可以满足您的任何需求。我不清楚0,5,0,5意味着什么或f1.getData()要返回/做什么,但你可以将f1定义为可以在该列表中找到对象的ValueProvider类型。

public class AribtraryDataVP implements 
        ValueProvider<ArbitraryFunctionData, Double>() {
  private final int index;
  public AribtraryDataVP(int index) {
    this.index = index;
  }
  public Double getValue(ArbitraryFunctionData object) {
    return object.getData().get(index);
  }
  public void setValue(ArbtraryFunctionData object, Double value) {
    object.getData().set(index, object);
  }
  public String getPath() {
    return "data[" + index + "]";
  }
}

ValueProvider类型的目的是允许访问对象的读写属性。在你的情况下,你可能不关心setValue,但通常很好地实现它或至少抛出异常,所以你知道有人试图调用它而它不起作用。同样,getPath方法用于区分属性,有时用于调试目的,有时用于在服务器上进行排序或过滤,这需要应该对其进行排序/过滤的属性的名称。再一次,在你的情况下可能不需要,但通常做得好。

我认为这会做你想做的事情,将那些ValueProviders(即属性,现在映射到列表项)添加到图表中。

//f1, f2
axis.addField(new AribtraryDataVP(1));
axis.addField(new AribtraryDataVP(2));