Сортировка и фильтрация представлений: сортировка и фильтрация GlazedList + JTable против списка событий Glazed + JXTable - PullRequest
0 голосов
/ 20 октября 2011

Я хочу создать пользовательские представления (таблицы) с возможностями сортировки и фильтрации. Я использую EventList ( Glazed Lists ) в качестве источника для EventTableModel. В GlazedLists также есть Sorted List и некоторые фильтрующие элементы, так что я могу использовать их для создания представления. Но я нашел JXTable и у него есть методы для сортировки и фильтрации, и вот как я хочу, чтобы это работало: сортировка и фильтрация должны обеспечивать компонент пользовательского интерфейса, а модель просто может хранить данные:

EventList<Item> source=new BasicEventList<Item>();
TableModel model=new DefaultEventTableModel<Item>(source,tableFormat); // It'll be
//perfect if I could create model without tableFormat,
//because it's presentation of data,
//but in GlazedLists I can't :( ...
JTalbe ui=new JXTable(model); // UI with sorting and filtering

Но GlazedLists также предоставляет SortedList (декоратор для EventList с сортировкой) и некоторые методы фильтрации.

EventList<Item> source=new BasicEventList<Item>();
SortedList<Item> sortedSource=new SortedList<Item>(source,comparator);
TableModel model=new DefaultEventTableModel<Item>(sortedSource,tableFormat); 
// model with sorting... not very beautifull for me, but what do you think?

JTable ui=new JTable(model); // UI with sorting provided by model

И вопрос в том, какая модель лучше. Или, может быть, оба не правы, и что использовать для создания представлений?

Ответы [ 2 ]

1 голос
/ 22 октября 2011

В случае использования DefaultEventTableModel все в порядке.Как модель регистрирует сортировщики на источник EventList.Это сделано внутренне, как в вашем втором списке.В случае, если вы регистрируете сортировщики вручную, вам необходимо реализовать весь код, чтобы изменить компаратор (например, asc, desc).При попытке использовать фильтрацию то же самое, но JXTable imho не поддерживает механизм для этого, поэтому вы должны сделать это по-своему.

0 голосов
/ 02 декабря 2011

Я голосую за GlazedLists, потому что это работает. Да, TableModel, который вы используете с таблицей, тесно связан с представлением, но вы отделяете эту модель таблицы от ваших исходных данных.

Функции сортировки и фильтрации GlazedLists гораздо более гибкие, чем в JXTable. Просто убедитесь, что они оба не включены, иначе все запутается. Вот мой обычный фрагмент кода для использования SortedList с JXTable:

private <T> EventTableModel<T> setupTable(JXTable table, TableFormat<T> tf, EventList<T> displayItems, SortedList<T> sortedItems)
{
    table.setColumnControlVisible(true);
    table.setSortable(false);
    table.getTableHeader().setDefaultRenderer(new JTableHeader().getDefaultRenderer());
table.setAutoCreateRowSorter(false);
table.setRowSorter(null);

    EventTableModel<T> etm = new EventTableModel<T>(displayItems, tf);
    table.setModel(etm);

    TableComparatorChooser.install(table, sortedItems, AbstractTableComparatorChooser.SINGLE_COLUMN);
    return etm;
}

Что это делает:

  • включить гаджет выбора столбцов в правом верхнем углу JXTable
  • отключить встроенную сортировку JXTable
  • вместо этого установите функции сортировки GlazedLists
  • настроить таблицу с EventTableModel, полученной из TableFormat

Обратите внимание, что вы передаете два EventLists, displayItems, который является списком в конце конвейера, и sortedList, используемый для управления тем, какой столбец используется для сортировки, что может быть раньше в конвейере чем список displayItems. (Если ваш последний элемент - sortedList, без какой-либо обработки после этого, просто передайте список дважды.)

...