2013-03-23 67 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

相關問題