2013-03-23 41 views
1

这是事情..我想画一些网站的图表一些网页。 这些图表有时候会有一两行......但有时候还会多一些,其中每个都是由任意的数学函数定义的。至于现在,我只知道这种绘制图像的可能性。三线:PropertyAccess:有没有办法动态创建访问函数?

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

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)); 
+0

我看了看它,这似乎使我朝着正确的方向,但似乎我真的不能变通解决'@Path(“X”) ModelKeyProvider x键( );'事情..ArbitraryFunction现在定义为'公共抽象类ArbitraryFunction实现ValueProvider '但现在我不知道如何管理ModelKeyProvider。我想要的只是将多条线条动态添加到图表中。 – displayname 2013-03-25 15:55:01

+1

您需要更改您的问题 - 而不是无法完成的任务,从您想要实现的目标开始,然后继续尝试所尝试的目标。但要重申,PropertyAccess不能为动态属性集做任何事情。放弃任意功能的想法 - ValueProvider *就是那个功能。您可以查看本博客文章的ValueProvider部分:http://www.sencha.com/blog/building-gxt-charts/ – 2013-03-25 15:58:43

+0

图表如何区分行吗?我知道这个问题听起来很愚蠢,但是..我根本没有意识到这一切,为什么看起来很棘手,只需添加几行到图表...... – displayname 2013-03-27 11:35:03

相关问题