2016-01-18 3 views
0

У меня есть ObservableList<Person>, где Person имеет firstName и lastName свойств (в соответствующем образе JavaFX), и я хочу сделать ListView, который будет отображать имена людей и отражают изменения как в списке и свойства индивидуальный Person объектов в списке. Как это лучше всего сделать? Есть два вопроса:Как использовать JavaFX ListView со сложными данными?

  1. Нам нужно сделать ListView соблюдать два свойства имен, поэтому он может обновить изменения. Один из способов сделать это объясняется в this answer (см. Также this answer). Однако это решение требует передачи «экстрактора» в конструктор ObservableList, и мой список уже существует (как часть более крупной модели данных). Казалось бы, есть способ обернуть существующий ObservableList, чтобы добавить экстрактор, но я не вижу его в API. (Ну, есть this method, но он обрабатывает список, который обернут как просто List, а не ObservableList, поэтому обновления исходного списка не сообщаются. Также есть this method, который создает «синхронизированную» обертку ObservableList, но он не включает параметр экстрактора.) Возможно, мне нужно просто реализовать метод, чтобы сделать эту упаковку самостоятельно?

  2. Мы должны визуализировать Person элементов в ListView. Я знаю, как это сделать, используя собственный класс ListCell, но я надеюсь, что может быть проще, так как я показываю только строки. Опираясь на Person.toString, это неправильная вещь, так как у меня могут быть другие взгляды Person, которые требуют разных преобразований Person - String. Есть ли способ передать ListView<Person>Callback<Person,String> (или что-то подобное) для преобразования элементов в строки?

Таким образом, в конце концов, у меня есть способ сделать то, что я хочу: написать свою собственную оболочку, в 1 и использовать пользовательские фабрики ячеек в 2. Я просто чувствую, что это требует больше работы с моей стороны чем это должно было бы, по моему мнению, относительно распространенной ситуацией. Есть ли более простой способ, которым я не хватает?

+0

См http://stackoverflow.com/questions/34602457/add-extractor-to-existing-observablelist –

+0

@James_D: спасибо! Я как-то не попал на эту страницу в поисках. Я только что начал с JavaFX сегодня, и это было немного разочаровывающим, пытаясь найти такую ​​информацию ... – Winnie

ответ

0

Это ответили на комментарии к Add extractor to existing ObservableList.

Создайте новый наблюдаемый список с помощью экстрактора и двунаправленный привязкой содержимого к существующему списку. Что-то вдоль линий

ListView<Person> listView = new ListView<>(); 
ObservableList<Person> personList = FXCollections.observableList(person -> 
    new Observable[] {person.firstNameProperty(), person.lastNameProperty()}); 
Bindings.bindContentBidirectional(model.getPersonList(), personList); 
listView.setItems(personList); 
Смежные вопросы