В моем приложении у меня есть JTable и список.
Список :
Список заполняется с использованием запроса JPA. Пользователь может повторно выполнить запрос, изменив атрибуты в графическом интерфейсе. Давайте предположим, что запрос имеет именованный параметр «год», и пользователь может изменить это. Затем происходит следующее (упрощается, если исключить обработку исключений):
myList.clear()
mylist.addAll( myQuery.setParameter("year", 2010) )
При изменении списка привязка запускает необходимые обработчики, и таблица теперь отражает новый набор данных.
Таблица J :
Содержимое JTable происходит от BeansBinding (точнее, JTableBinding
). Источником привязки является вышеуказанный список.
Запрос выполняется только для интенсивных задач. Как применение грубого фильтра к огромному набору данных. Более ранний пример с годом - хороший пример. Это всегда возвращает управляемый кусок данных клиенту. Теперь, чтобы пользовательский интерфейс был более отзывчивым, в самом JTable-фильтре предусмотрены более тонкие фильтры. Это позволяет избежать ненужных обращений к базе данных.
Далее предположим следующий сценарий: пользователь выбирает строку в таблице и нажимает кнопку удаления. Если в таблице было отфильтровано , а не , требуемый код является простым (опять же, без проверки ошибок, блокировки параллелизма и обработчиков исключений для простоты кода):
MyObject = myList.get( myTable.getSelectedRow() );
myEntityManager.getTransaction().begin()
myEntityManager.remove( myObject )
myEntityManager.getTransaction().commit()
Однако : если таблица фильтруется на стороне клиента, таблица не будет отражать данные внутри списка. Поэтому getSelectedRow()
не будет возвращать индекс, который будет сопоставляться с той же записью в списке ( Я не проверял это, но я верю, что я правильно с этим предположением? )
Итак ... Мой вопрос:
Как лучше всего это решить?
Возможное решение?
Я решил проблему с помощью следующего:
- Я создал новый Бин с именем
selectedTableElement
, который содержит член, содержащий элемент, который в данный момент выбран в таблице.
Затем я создал новую привязку (источник: моя таблица, цель: мой компонент selectedElement), используя
binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, myTable, ELProperty.create("${selectedElement}"), selectedTableElement, BeanProperty.create("selectedElement"), "selectedElementBinding");
Это решение эффективно решает проблему, отслеживая выбранный элемент таблицы с помощью привязки Beans.
Но действительно ли это необходимо? Мне это кажется неуклюжим. Целый новый класс только инкапсулирует выбранный элемент? Нет ли другого, более прямого способа получения "${selectedElement}"
свойства JTable
?