Форум программистов, компьютерный форум, киберфорум
JavaFX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186

JavaFX программно выбрать запись в TableView

12.10.2016, 13:39. Показов 4870. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть проблема с программным выбором записи в TableView. Есть две вьюшки. На одной TableView, другая вьюшка для добавления записи в эту таблицу.

Если сделать:
Java
1
2
3
4
5
6
7
8
// создаем item
// .....
// сохраняем в бд
itemDao.save(item)
// добавляем в tableview
tableView.getItems().add(item);
// подсвечиваем новую запись
tableView.getSelectionModel.select(item);
То все нормально. Запись добавляется и тут же подсвечивается строка.

Вариант номер два. После создания item я сохраняю его в базу и полностью пересоздаю вьюшку, в ней загружается TableView, который подтягивает из базы данных item'ы. После этого надо подсветить нужный.

Java
1
2
Item item = itemDao.getById(3);
tableView.getSelectionModel().select(item);
Не подсвечивает. Долгие колупания в дебаггере показали, что при запуске вьюшки выбирается список item'ов из базы в ArrayList, потом он конвертируется в ObservableList<Item> и уже этот ObservableList сетается в TableView. На всех этих этапах хэш объекта item (того же, с id=3) не изменяется. Потом, когда я делаю
Java
1
Item item = itemDao.getById(3);
Хэш объекта item не совпадает с элементом в ObservableList.

Т.е. получается такая ситуация, когда мы имеем один свободный объект item, имеем полную его копию в ObservableList, но они не совпадают, потому что не совпадают их хэши. И подсветить этот объект поэтому нельзя.

Может кто-нибудь пояснить, почему и что с этим можно сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2016, 13:39
Ответы с готовыми решениями:

JavaFx вставка в tableView
Здравствуйте. Подскажите пожалуйста как добавить строку в tableView . Например: у меня есть класс Client, он имеет поля -id. Пишу такой код...

Заполнение TableView в JavaFX
В JavaFX Builder разместил TableView, указал для него fx:id. Так же разместил в таблице TableColumn. Установил для каждого fx:id. После в...

Не правильный вывод в TableView javafx
Вывожу из БД в таблицу нормально , но отображает с лишними записями(Смотреть на картинке 1). не получатся убрать.Привожу пример шаблона...

11
 Аватар для TurboDuck
50 / 49 / 13
Регистрация: 23.11.2015
Сообщений: 401
12.10.2016, 14:04
Virkom,
1. А вообще TableView то подсвечивает хоть что то? Может рендеринг надо переопределять как в Swing JTable?
2. А зачем тебе хэшкоды? Вроде их для быстрого предварительного сравнения используют. Может попробовать equals() переопределить под свои нужды?
PS. Сам только изучаю Java, может не компетентен в этом еще.
1
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186
12.10.2016, 14:35  [ТС]
Цитата Сообщение от TurboDuck Посмотреть сообщение
1. А вообще TableView то подсвечивает хоть что то? Может рендеринг надо переопределять как в Swing JTable?
2. А зачем тебе хэшкоды? Вроде их для быстрого предварительного сравнения используют. Может попробовать equals() переопределить под свои нужды?
PS. Сам только изучаю Java, может не компетентен в этом еще.
1. Подсвечивает только рамку вокруг таблицы. Не строку. Т.е. таблица фокус получает, но бестолку. Это JavaFX, поэтому Swing JTable я не использую.
2. Насколько я понимаю, поиск объекта для подсветки происходит по хэш-тегу. Потому что объекты абсолютно одинаковые. Но java считает, что нет. Различаются только хэшами. Насчет equals() не знаю, можно попробовать.

Есть одна мысль, сейчас проверяю.
0
 Аватар для TurboDuck
50 / 49 / 13
Регистрация: 23.11.2015
Сообщений: 401
12.10.2016, 14:42
Virkom, все объекты сравнимы между собой, хотя бы равенство ссылок для них уже определено.
Взаимосвязь hashCode() и equals(): если по логике equals() два объекта равны, то и hashCode() у них должны быть одинаковые. hashCode() есть смысл сравнивать для быстрой проверки, если hashCode() разные, то сравнивать equals() уже смысла нет.
По поводу переопределения equals(). По умолчанию любой объект имеет метод equals() наследованный от Object. Дефолтный equals() сравнивает ссылки, а не содержимое. При переопределении equals() для конкретных объектов будет сравнивать содержимое.
1
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186
12.10.2016, 14:50  [ТС]
Просмотрел еще раз, объекты отличаются. Связями. В каждом item'е есть ссылка на юзера, который его добавил в бд.

Юзер один и тот же в обоих item'ах, но у них опять же, разные хэши. Поэтому и хэш всего объекта считается другим.
Связи подтягиваются с fetchType Lazy в Hibernate. В БД вообще один юзер. Не может быть он разным у двух объектов.
0
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186
12.10.2016, 15:15  [ТС]
Вообще, что-то интересное:
Java
1
2
GroupType groupType = groupTypeDao.findById(3);
GroupType groupType1 = groupTypeDao.findById(3);
Вот что получается:
Миниатюры
JavaFX программно выбрать запись в TableView  
0
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186
12.10.2016, 15:20  [ТС]
Другой проект:

Java
1
2
Campaign campaign = campaignDao.findById(5);
Campaign campaign1 = campaignDao.findById(5);
Результат во вложении.

В этих двух проектах DAO содержат совершенно одинаковые методы, Hibernate настроен одинаково. Версия Hibernate также одна и та же. Что не так - не пойму.
Миниатюры
JavaFX программно выбрать запись в TableView  
0
 Аватар для TurboDuck
50 / 49 / 13
Регистрация: 23.11.2015
Сообщений: 401
12.10.2016, 16:37
Virkom, ого! жесть! А в чем отличие groupType от compaign у тебя? Может там собака зарыта?
1
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186
12.10.2016, 17:01  [ТС]
Цитата Сообщение от TurboDuck Посмотреть сообщение
ого! жесть! А в чем отличие groupType от compaign у тебя? Может там собака зарыта?
GroupType и Campaign - совершенно разные объекты. В разных проектах. Но способ доступа к ним одинаков.

GroupType имеет id, name, userAdded, dateAdded, userModified, dateModified.
Campaign имеет также id, name, userAdded, dateAdded, userModified, dateModified.

Только Campaign имеет еще парочку других полей.

Получаются они совершенно одинаково из БД:

Java
1
2
3
4
5
6
7
8
    @Override
    public Campaign findById(Integer id) {
 
        return (Campaign) sessionFactory.getCurrentSession()
                .createQuery("from Campaign where id = :id")
                .setParameter("id", id)
                .uniqueResult();
    }
Java
1
2
3
4
5
6
7
    @Override
    public GroupType findById(Integer id) {
 
        return (GroupType) sessionFactory.getCurrentSession()
                .createQuery("from GroupType where id = :id")
                .setParameter("id", id).uniqueResult();
    }
Настройки Hibernate одинаковые. Я никак не пойму, почему разное поведение. Более того, если сделать
Java
1
2
GroupType groupType = groupTypeDao.findById(3);
GroupType groupType1 = groupTypeDao.findById(3);
то
Java
1
groupType.equals(groupType1)
выдаст false. Они не одинаковые. Хотя по сути, должны быть идентичны. Мистика.
0
 Аватар для TurboDuck
50 / 49 / 13
Регистрация: 23.11.2015
Сообщений: 401
15.10.2016, 09:56
Virkom, не вот это случайно?
http://hibernate.org/validator... g-started/
1
59 / 59 / 20
Регистрация: 21.03.2013
Сообщений: 186
16.10.2016, 16:49  [ТС]
Цитата Сообщение от TurboDuck Посмотреть сообщение
не вот это случайно?
http://hibernate.org/validator... g-started/
Нет, это просто валидатор. Спасибо за помощь, но мне уже мой тимлид объяснил, что происходит.

Штука в том, что два объекта из базы действительно будут разными. Для того, чтобы они были одинаковыми - нужно или переопределять equals() и hashCode() или сравнивать по ID.

Почему работает на другом проекте по-другому? Потому что там как-то настроен Hibernate proxy, который второй раз вместо объекта отдает ссылку на предыдущий объект. Как это работает, я еще не разобрался, но буду разбираться.
В общем варианта решения проблемы (подсветить нужную запись в таблице) два. Первый - переопределить equals() и hashCode(). Тогда конструкция
Java
1
tableView.getSelectionModel().select(item);
должна работать.
И вариант номер два - написать метод, который будет перебирать tableView.getItems() в цикле, искать элемент с нужным ID, определять его порядковый номер в списке и подсвечивать объект по номеру строки.
С Hibernate proxy возиться неохота.
1
 Аватар для TurboDuck
50 / 49 / 13
Регистрация: 23.11.2015
Сообщений: 401
19.10.2016, 08:09
Virkom, спасибо за лик без, буду тоже знать теперь. Про переопределение equals и hashCode я кстати писал выше.. но все такие ситуация до конца не была понятна, что именно там происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2016, 08:09
Помогаю со студенческими работами здесь

Некорректный вывод в TableView (javafx)
В TableView выводится не значение, а похоже, что сам объект ячейки. В этом деле только осваиваюсь. Чувствую, что не туда копаю :wall: ...

Динамическое заполнение TableView в JavaFX
Проблема вот в чем. Заполнить tableView получилось без проблем. Но у меня есть еще listView, в котором список всех таблиц. И когда я...

Не отображаются данные в Tableview JavaFX
Здравствуйте, заранее прошу прощения, знаю, что много тем по моему вопросу, но не смог понять в чем проблема. Только начал изучать JavaFx. ...

Отображение данных в TableView JavaFX
Controller1: import javafx.collections.FXCollections; import javafx.collections.ObservableList; import...

JavaFX. Как заполнить TableView из файла?
Ребята, помогите исправить код, есть метод, который добавляет в файл данные сотрудника,(если правильно понимаю сериализация) затем из этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru