2017-02-05 6 views
0

はサンプルコードです:ForEachの更新のようなリストをバインドするには?ここ

public class Example3 { 

    class Point { 
     int x, y; // these can be properties if it matters 
    } 

    class PointRepresentation { 
     Point point; // this can be a property if it matters 

     public PointRepresentation(Point point) { 
      this.point = point; 
     } 
    } 

    Example3() { 
     ObservableList<Point> points = FXCollections.observableArrayList(); 
     ObservableList<PointRepresentation> representations = FXCollections.observableArrayList(); 
     points.forEach(point -> representations.add(new PointRepresentation(point))); 
    } 
} 

私はデータ保持Pointとデータrepresentor PointRepresentationを持っています。私はポイントのリストを持っていますし、リスト内の各ポイントについて、2番目のリストに同等の表現オブジェクトが存在することを望みます。私が与えたコードは初期化のために働いていますが、後に変更があれば、上記は更新されません。

変更リスナーを使用してリストを同期しています(変更オブジェクトに基づいて要素を追加および削除します)。これは問題ありませんが、もっと簡単な解決策があるのだろうかと思います。私は「各バインドのため」のようなものを探していました。つまり、あるリストの各要素には、指定された関係(私の場合はそのコンストラクター)が1つあります。擬似コードで:リストのための抽出が、リスト自体が変化したときに、オブジェクト内のプロパティは、彼らが変更を保持していないときには、アップデートを送信:私は見て

representations.bindForEach(points, point -> new PointRepresentation(point)); 

物事。だから私の場合ではxがポイントの変更私はそれを通知する抽出を行うことができます。私が見た別のものはhttp://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/ListBinding.htmlなので、おそらくカスタムバインディングがありますが、それが簡単かどうかわかりません。

リストの代わりに配列にも同様のソリューションがありますか?私は可能性としてhttp://docs.oracle.com/javase/8/javafx/api/javafx/collections/ObservableArray.htmlを見た。

答えて

0

サードパーティのライブラリReactFXには、このための機能があります。あなたはこれがpointsへなどの変更を追加/削除を自動的にrepresentationsを更新します

ObservableList<Point> points = FXCollections.observableArrayList(); 
ObservableList<PointRepresentation> representations = LiveList.map(points, PointRepresentation::new); 

を行うことができます。

+0

'LiveList.map'は、' bindForEach'での意味とまったく同じように見えます。すばらしいです。配列のようなものがありますか? – Mark

+0

@マーク私は配列に似たものはないと信じています。とにかく配列に 'add'や' remove'はできません。 –

+0

OK。私は[ObservableArray](https://docs.oracle.com/javase/8/javafx/api/toc.htm)を見ていました。それは非常に未開発のようです。サポートされているプリミティブは2つだけで、Integerのjavadocをコピーするのは「Face」です。 – Mark

関連する問題