Лабораторная работа. Использование коллекций в пользовательском интерфейсе JavaFX — КиберПедия 

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Лабораторная работа. Использование коллекций в пользовательском интерфейсе JavaFX

2022-10-10 51
Лабораторная работа. Использование коллекций в пользовательском интерфейсе JavaFX 0.00 из 5.00 0 оценок
Заказать работу

Пожалуйста, что просто так все взять и заменить нельзя. Там во-первых packageнет, а потом у них имя класса. Поэтому копируем аккуратно.

run: == invalidate! [7 2, 2 3, 7 9] 7 2 2 3 3 4   7 2 2 3 7 9 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

Итак, программа в целом работает. Я в эту программу сам закинул Box. Почему? Мне было интересно, а если в коллекции изменится не состав коллекции в плане нового элемента или удалили элемент, а если изменится значение в самом элементе, она сможет это распознать? Не сможет. Почему? Простите, а каким образом? Обертка следит за коллекциями, а не за конкретными объектами в коллекции. Она следит за самой всей коллекцией. Если я коллекционный объект меняю, то никто ничего не видит. Но я в свое время давным-давно такой код писал, который сообщает еще об изменении элементов в самой коллекции. Надо Boxсделать, чтобы он тоже обладал возможностью ваш класс сообщать об изменении. Конечно, придется писать ручками, но это по образу и подобию, как, например, в этих обертках сделано. Если сюда добавить правильный интерфейс, то можно, чтобы ваш класс подписался на изменения в Box, и тогда все работает. Надо писать свои бизнес-объекты правильно, чтобы функционал в них был. Итак.

Здесь используется обычный ArrayList. Это обычная коллекция. В этой коллекции 2 элемента:

· 1, 2;

· 2, 3.

Т.е. два Box.

Дальше создается ObservableList, а именно – это копия.

ObservableList<Box> olist=FXCollections.observableArrayList(list);

Это копия.

Я сейчас закомментирую всю эту кучу строк с addListener. Не надо нам пока. Просто разберемся с самой копией. Просто закомментирую.

Итак, что у нас происходит? olist – это «копия» (от «observablelist») для наблюдения, которая умеет сообщать об изменении.Значит я в список добавляю новый элемент (в исходный) – 3, 4. И еще в этом списке (один из них) меняю у него размер. А потом в новый список добавляю элемент, но только не 7, а 127. И печатаю оба списка.

Вот смотрите. Видите мы в новый исходный список добавили новый объект? Ну естественно, его не появилось в копии, потому что копия была сделана раньше.

А вот в копию был добавлен новый элемент. Естественно, он не появился в исходном, т.к. они разные копии двух списков. Понятно? Копия!

Вопрос: Если все понятно, попробуйте объяснить, почему когда я изменил в исходном списке у первого элемента значение «a»на 7, это произошло и во втором?

Ответ из зала: Попало уведомление какое-то, наверно.

Ответ препода: Нет, здесь никаких уведомлений нет. Они между собой не связаны. Копия – это отдельно. Я создал копию исходного списка и всё. И они между собой через уведомления не связаны. Это было бы очень сложно. Это было бы крайне серьезно.

Мы забыли следующую фразу, что копии, который создаются в Java, они являются «поверхностными копиями». Нарисуем следующую картину. Вот у меня list – в нем 2 элемента. Вот у меня olist – это копия, и у него тоже будет два элемента. Вот первая коллекция – listиз двух элементов. Что из себя представляют эти два элемента? Эти два элемента представляют из себя ссылки на объекты. Вот у нас один Box, а вот у нас второй Box. А когда вы делаете копию, то создается точно такая же коллекция, как сверху, естественно, состоящая из двух элементов и эти два элемента. А это их копия. Значит они хранят те же самые значения. И это ссылки на те же самые объекты. Т.е. при создании копии коллекции, создается только копия ссылок, а Box’ы остаются те же самые. Это и называется – поверхностная копия.

Поэтому, что я здесь изменю 7, используя эту ссылку, что эту ссылку. Какая разница? Коллекционный объект Box – одна штука. Но потом, когда я в первую коллекцию добавил элемент, он на свой Box. А когда я во вторую коллекцию добавил элемент, он на свой Box. Потому что это было после копирования. Так что коллекции рассинхронизировались.

А теперь после того, как мы знаем, что это все у нас работает, снимается первый комментарий с addListener.Он сообщает об изменении.

Причем я вот эти изменения с listсделаю после. Здесь так получается, что я вначале сделал изменения, а потом говорю: «давай-ка я подпишусь на изменения!». Нет, давай вначале подпишусь, а потом буду делать изменения.

Т.е. создал список, создал копию, а уже только потом сделал подписчика на изменения и пошел все изменять. На list что-то поменял, потом на olistчто-то поменял. Ну давайте пока observable закомментирую.

Есть invalidate? Нету. listне имеет возможности ни о чем сообщить.

Возвращаем observableи добавляю сюда новый Box. Видите? invalidate. Коллекция говорит: «я изменилась!». Нормально.

Если вы хотите быть в курсе, что там именно изменилось – не вопрос!

Там можно вытянуть добавленные элементы. Там код конечно надо будет писать, через printfне получится, как в первом примере, одной строчкой. Одной строчкой можно напечатать весь список. А для изменений надо писать код.

Но в целом функционал вы видите –observableList. Согласитесь, ведь это же удобно. Что я делал? Ведь это же целая история. Коллекция меняется, она должна там как-то все контролировать у себя, смотреть, должна рассылку делать подписавшимся, должна запоминать подписавшихся. Это целая инфраструктура. Вот этот observableListи делает это для вас.


Поделиться с друзьями:

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.