这是事情..我想在网站的某些图表中绘制一些线条。 这些图表有时会有一两行...但有时会有一些更多,其中每一行都是由任意数学函数定义的。
至于现在,我只知道这种可能性。三行:
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
中预先定义。
我希望我能正确描述我的需要。有谁知道这可能的解决方案?
答案 0 :(得分:1)
PropertyAccess
不是重点 - ValueProvider
。 PropertyAccess
类型只是一种自动生成一堆非常无聊的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));