Как включить поведение GUI для сортировки JTable, когда SQL выполняет сортировку? - PullRequest
1 голос
/ 27 мая 2009

Как включить значки и поведение JTable для сортировки строк таблицы по столбцу, не позволяя ей использовать предикат сравнения для сортировки? То есть, как мне указать заголовкам таблицы показывать стрелку для возрастающего / убывающего порядка сортировки в используемом столбце и заставить его вызывать соответствующие методы при изменении порядка сортировки / столбца?

Я пытаюсь создать (редактируемый, фильтруемый, сортируемый) JTable, поддерживаемый SQL-запросом или представлением. Строки могут не помещаться в памяти и могут отображаться некорректно на объекты Java, поэтому я хочу выполнить всю сортировку / фильтрацию в SQL. Я уже написал код для изменения запроса с учетом сортировки по столбцам, фильтрации по значениям и видимых столбцов.

Чтобы использовать это, я планирую написать JTableModel на основе ResultSet с TYPE_SCROLL_SENSITIVE, и CONCUR_UPDATABLE, поэтому изменения в БД распространяются в ResultSet. Я буду периодически (несколько раз в секунду) принудительно обновлять видимый JTable из ResultSet, поэтому изменения в базе данных станут видимыми для пользователя. Пользовательские изменения в таблице будут переданы в обновляемый ResultSet после проверки.

Я немного посмотрел на то, как сортировка выполняется нормально, но большинство реализаций, похоже, полагаются на JTable, создающий javax.swing.RowSorter с предикатом Comparator, или на поддержание отсортированного списка строк, которые запускают события, когда изменилось. Итак, мои вопросы:

Платформы ORM НЕ являются ответом на этот вопрос, поскольку данные плохо отображаются на объекты сущностей. Кроме того, я использую СУБД H2.

EDIT: Сортируемые библиотеки JTable, основанные на применении компараторов или предикатов сортировки к объектам строк, к сожалению, также не подходят. Я не верю, что смогу удерживать все объекты в памяти для выполнения сортировки. Эта проблема не позволяет мне использовать SwingX JXTables, GlazedLists или подобные библиотеки. Я бы хотел, но не могу. Период.

** Я буду иметь дело со многими тысячами строк, возможно, миллионами, с многочисленными столбцами. Да, мне действительно нужно использовать SQL для сортировки и фильтрации. **

Вопросы: (по убыванию)

  1. Как показать индикаторы, для которых столбец используется для сортировки строк?
  2. Как заставить JTable запускать соответствующие события, когда заголовки столбцов нажимаются ЛЕВЫМ для изменения порядка сортировки?
  3. Есть ли более простой способ принудительно обновить JTable при изменении базы данных?
  4. Существует ли библиотека, которая значительно упростила бы все это (соединяя запросы или представления БД и JTables)?
  5. Буду ли я сталкиваться с ужасными, ужасными проблемами, когда проектирую систему, подобную этой?

Ответы [ 4 ]

1 голос
/ 08 июня 2012

Вы должны иметь возможность создать подкласс javax.swing.RowSorter для создания сортировщика строк, который выполняет сортировку в базе данных. Из документов API:

"Реализации RowSorter обычно не имеют однозначного сопоставления с базовой моделью, но могут. Например, если база данных выполняет сортировку, toggleSortOrder может вызывать базу данных (на фоновый поток) и переопределите методы отображения, чтобы вернуть переданный аргумент. "

http://docs.oracle.com/javase/6/docs/api/javax/swing/RowSorter.html

1 голос
/ 27 мая 2009

Я никогда не использовал его сам, но Сетка данных JIDE предоставляет DatabaseTableModel, который обеспечивает поддержку фильтрации и сортировки с использованием SQL WHERE и ORDER BY.

1 голос
/ 27 мая 2009

В ответах на 1 и 2 отметьте SwingX , который уже включает в себя класс таблицы со встроенной сортировкой (и фильтрацией). Возможно, вы сможете адаптировать это.

Буду ли я сталкиваться с ужасными, ужасными проблемами, когда проектирую такую ​​систему?

Из опыта да. Я работал над проектом, почти таким же, как этот, где кто-то разработал JTable, который предположительно «магически» привязан к таблице базы данных. Эта объединенная логика отображения и доступ к базе данных объединены в один большой ужасный беспорядок, который мы полностью заменили моделями таблиц, управляемых отражением, и отдельными операциями записи CRUD.

Вы говорите, что ORM не ответ ...

  • Если формат данных не меняется, то все равно стоит рассмотреть. Ваши классы «сущностей» не обязательно должны представлять сущности реального мира.

  • Если (как я подозреваю) формат вашей сущности изменится, возможно, стоит подумать:

    • Гибкий класс Record на основе карты, в котором записи хранятся в виде пар ключ-значение;

    • Динамически построенные модели таблиц для вашей логики отображения, построенные путем запроса ключей записи, подключенные к таблицам SwingX для бесплатной сортировки и фильтрации;

    • Аналогично разработанный класс Repository, который инкапсулирует доступ к вашей базе данных отдельно от самой таблицы, отвечая за загрузку и сохранение Record s. Это действует как адаптер между вашим обновляемым ResultSet и представлением (хотя я бы проверил, будет ли использование ResultSet таким способом требовать открытого соединения с базой данных, пока данные видны ...).

    Это разделение на «таблицу, которая отображает и сортирует записи» и «хранилище, которое управляет данными» означает:

    • Вы можете повторно использовать таблицу для данных, не связанных с базой данных;
    • Вы можете отображать связанные с базой данных записи в других вещах, кроме таблиц;
    • Вы не сойдете с ума, пытаясь построить и протестировать устройство :) 10 *
0 голосов
/ 27 мая 2009

Оставляя в стороне базу данных, есть класс с именем SortableTable , который является частью сетки JIDE. Он отображает сортировку с небольшим ^ или v в заголовке таблицы и поддерживает сортировку по более чем одному столбцу (1v, 2v и т. Д.).

alt text

...