Как извлечь "$ {selectedElement}" из JTable, где элементы связаны с List - PullRequest
1 голос
/ 16 ноября 2010

В моем приложении у меня есть 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?

1 Ответ

1 голос
/ 19 февраля 2011

Я постараюсь ответить на оба ваших вопроса.
По первому вопросу (отфильтрованный выбранный индекс по сравнению с индексом реального списка):

  • Я предполагаю, что вы связали таблицу с помощью BeansBinding через createJTableBinding. Таким образом, фильтрация на стороне клиента может быть применена посредством использования Swing TableRowSorter и RowFilter. Я прав ? если это так, вы можете использовать метод
    int row = myTable.convertRowIndexToModel(myTable.getSelectedRow());
    преобразовать выбранную строку в отфильтрованном виде в фактическую выбранную строку в модели.

По второму вопросу (для сохранения выбранного элемента таблицы)

  • Вы также можете создать привязку, используя this в качестве исходного / целевого объекта, и создать свойство selectedElement в классе, содержащем таблицу. Таким образом, вам не понадобится другой класс. Код будет: createAutoBinding(UpdateStrategy.READ_WRITE, myTable,<br> ELProperty.create("${selectedElement}"), this, BeanProperty.create("selectedElement"), "selectedElementBinding");
    (обратите внимание также, что привязка READ_WRITE на самом деле не используется, поскольку привязка bean-компонентов не поддерживает изменение выбранного элемента из свойства bound)
...