Привязка содержимого JavaFX ObservableList

Я знаю, что вы можете создать привязку к списку следующим образом:

ObservableList list1 = ...;
ObservableList list2 = ...;

Bindings.createContentBinding(list1, list2);

Но я хочу связать их особым образом. Скажем, у меня есть эти типы:

Object obj = ...;
MyObject myObj = new MyObject(obj);

И эти списки:

ObservableList<Object> objList = ...;
ObservableList<MyObject> myObjList = ...;

Каждый раз, когда добавляется новый объект в objList, я хочу, чтобы он добавлялся в myObjList с помощью new MyObject(obj);

Вы можете связать другие свойства с помощью Bindings.create*Binding(...), но похоже, что для списков нет эквивалента.

Любые идеи о том, как преодолеть эту проблему?


person Chris Smith    schedule 07.07.2015    source источник
comment
Для этого нет встроенных возможностей. Посмотрите TransformationList, который может быть полезно для получения отправной точки.   -  person aw-think    schedule 07.07.2015
comment
Это на самом деле довольно сложно сделать правильно. См. stackoverflow.com/questions/31230312/ (это более или менее точная копия этого вопроса).   -  person James_D    schedule 07.07.2015


Ответы (1)


objList.addListener(e->{
    if(e.wasAdded)
    {
        if(myObjectList.size>=e.getFrom())
            myObjList.Add(new myObject(objList.get(objList.size-1)));
        else{
             myObjList.Add(e.getFrom(),new myObject(objList.get(e.getFrom()));
     }
    }
    if(e.wasRemoved)
    {
         myObjectList.Remove(e.getFrom());
    }   
    if(e.wasPermutated)
    {
         //handle this as well
    }
});

Надеюсь, это поможет :)

Отредактировано, чтобы получить измененный объект вместо того, чтобы предполагать, что последний был добавлен. Также удаление объектов. Вероятно, там есть какие-то неточности, так как я не компилировал и не проверял. Не стесняйтесь редактировать его, если это так. Надеюсь, по крайней мере, достаточно хорошо, чтобы получить общее представление о том, как это может быть реализовано.

person Daniel Hesslow    schedule 07.07.2015
comment
А что будет, если его добавить с Индексом в objList! Вы добавите последний элемент в myObjList дважды. - person aw-think; 07.07.2015
comment
Или если вы удалите элемент...? - person James_D; 07.07.2015
comment
Или что-то еще произойдет, например, перестановка :-) - person aw-think; 07.07.2015
comment
e.wasAdded предотвращает запуск других событий изменения, таких как удаление. (Я неправильно понял вас, James_D?) Однако NwDx был правильным, поэтому я изменил свой ответ, чтобы учесть это. - person Daniel Hesslow; 07.07.2015
comment
Да, вы неправильно поняли (и я, и NwDx): если вы удаляете элемент из исходного списка, вам нужно убедиться, что соответствующий элемент также удален из целевого списка. Кроме того, @NwDx указывал, что если вы делаете objList.add(someIndex, someObject), вам действительно нужно убедиться, что вы добавляете не только правильный элемент, но и добавляете его в правильное место в целевом списке (вы исправили одну часть, но не другую) . И ваш новый код не будет компилироваться: getFrom() возвращает int... Этот вопрос в любом случае является дубликатом: связанный вопрос имеет правильную версию вашего решения. - person James_D; 07.07.2015
comment
О, извините, я полностью виню свою усталость. Надеюсь, этого будет достаточно... - person Daniel Hesslow; 07.07.2015
comment
Я рекомендую вам написать некоторый код, чтобы проверить это, и протестировать все возможные способы изменения базового списка. Кажется, вы предполагаете (среди прочего), что только один элемент может быть добавлен или удален во время любого отдельного события изменения... Как я уже сказал в комментарии под вопросом, довольно сложно сделать это правильно. - person James_D; 07.07.2015
comment
Почему бы вам не повторить изменения с помощью e.getAddedList()? - person Chris Smith; 08.07.2015