1

事情是这样的。我想在网站的一些图表中画一些线。这些图表有时会有一两条线。但有时会多几条线,每条线都由任意数学函数定义。

至于现在,我只知道画三条线的可能性:

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.

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

4

1 回答 1

1

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

这意味着您可以手动实现ValueProvider它,做任何您想做的事情。我不太清楚0,5,0,5f1.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));
于 2013-03-24T00:27:14.007 回答