1

これが問題です.Webサイトのいくつかのチャートにいくつかの線を引きたいと思います。これらのチャートには、1 本または 2 本の線が含まれる場合もありますが、それぞれが任意の数学関数によって定義されている場合は、さらに数本の線が含まれることもあります。

今のところ、たとえば3本の線を描く可能性しか知りません。

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これは、あなたがやりたいことを何でもする手作りの実装を作ることができることを意味します。f1.getData() が何を意味するのか、または何を返す/実行するのかはよくわかりません0,5,0,5が、 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メソッドはプロパティ間の違いを伝えるために使用されます。デバッグ目的の場合もあれば、サーバーでの並べ替えまたはフィルター処理の場合もあり、並べ替え/フィルター処理するプロパティの名前が必要です。繰り返しますが、おそらくあなたの場合は必要ありませんが、通常は正しく行うのが良いでしょう.

これで、これらの ValueProvider (つまり、リスト項目にマップされたプロパティ) をチャートに追加して、あなたがやろうとしていたことを実行できると思います。

//f1, f2
axis.addField(new AribtraryDataVP(1));
axis.addField(new AribtraryDataVP(2));
于 2013-03-24T00:27:14.007 に答える