2017-02-05 3 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 данных и представляемых PointRepresentation данных. У меня есть список точек, и мне бы хотелось, чтобы для каждой точки в списке был бы эквивалентный объект представления во втором списке. Код, который я дал для инициализации, но если есть какие-либо изменения позже, это не будет обновляться.

Теперь я использую прослушиватель изменений для синхронизации списков (добавление и удаление элементов на основе объекта изменения), и все в порядке, но мне интересно, есть ли более простое решение. Я искал что-то вроде «для каждой привязки», что означает: для каждого элемента в одном списке есть один в другом с указанным отношением между ними [в моем случае это его конструктор]. В псевдокоде:

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. Вы можете сделать

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

Это обновит representations автоматически добавлять/удалять и т.д. изменения в points.

+0

'LiveList.map' выглядит точно так же, как я имел в виду с' bindForEach'. Великий. Есть ли что-то подобное для массивов? – Mark

+0

@Mark Я не верю, что что-то похожее на массивы. Вы все равно не можете «добавить» или «удалить» из массива. –

+0

ОК. Я смотрел на [ObservableArray] (https://docs.oracle.com/javase/8/javafx/api/toc.htm). Это кажется очень неразвитым. Поддерживается только 2 примитива и независимо от того, что «Лицо» копирует javadoc Integer. – Mark

Смежные вопросы