Как наблюдать за изменениями свойств элементов в ObservableList

Я разрабатываю мессенджер с JavaFX, чтобы лучше познакомиться с этой технологией.

Contact имеет два основных свойства: User и последнее Message.

мне нужно показать

  1. список контактов с последними сообщениями
  2. список контактов, отсортированный по имени

Я пришел к двум решениям до сих пор

Первое решение — сделать Contact неизменяемым. Таким образом, необходимо заменять контакт каждый раз, когда приходит новое сообщение или изменяется информация о пользователе. Это работает, но контакт мигает в ListView при обновлении.

Второе решение — использовать ObjectProperty:

public class Contact {
    private final ObjectProperty<User> user = ...; 
    private final ObjectProperty<Message> lastMessage = ...; 
}

В этом случае мне нужно создать собственный ObservableList для добавления/удаления слушателей к свойствам Contact, когда Contact добавляется/удаляется в/из списка. Это необходимо, потому что оба списка должны автоматически сортироваться.

Таким образом, оба решения имеют недостатки.

Пожалуйста, дайте свои рекомендации, как достичь моей цели.


person Denis Kokorin    schedule 23.03.2016    source источник
comment
Возможный дубликат Java 8 SortedList TableView не обновляется   -  person kleopatra    schedule 24.03.2016
comment
да, это - абсолютно очень похожая проблема с точно таким же средством ;-)   -  person kleopatra    schedule 25.03.2016


Ответы (1)


В классе FXCollections есть один метод, который использует функцию «извлекателя», чтобы сообщить списку, какие свойства из элементов списка должны запускать события изменения списка:

https://docs.oracle.com/javase/8/javafx/api/javafx/collections/FXCollections.html#observableArrayList-javafx.util.Callback-

Это даст вам тот же подход, что и ваше второе решение, но вам не придется писать код для самостоятельного управления слушателями.

person David Gilbert    schedule 23.03.2016
comment
Благодарю вас! Я как-то пропустил этот метод и экстракторы. - person Denis Kokorin; 24.03.2016