视图排序和过滤:GlazedList排序和过滤+ JTable vs GlazedList事件列表+JXTable



我想创建具有排序和过滤功能的用户视图(表)。我使用EventList(釉面列表)作为EventTableModel的源。GlazedLists中还有Sorted List和一些过滤项,所以我可以用它们来创建视图。但是我发现了JXTable,它有排序和过滤的方法,这就是我想要它的工作方式:排序和过滤必须提供UI组件和模型可以保存数据:

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

问题是:哪种模式更好。或者两者都错了,创建视图用什么呢?

如果你使用DefaultEventTableModel一切都是好的。当模型在EventList源中注册排序器时。这是在内部完成的,如清单2所示。如果您手动注册排序器,那么您必须实现所有代码才能更改比较器(例如asc, desc)。当尝试使用过滤时也是一样的,但是JXTable不支持这种机制,所以您必须以自己的方式完成。

我投票给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的排序功能代替
  • 使用从TableFormat
  • 派生的EventTableModel来设置表

注意,传入两个 EventLists,一个displayItems是管道末端的列表,另一个sortedList用于控制哪一列用于排序,它可以在管道中比displayItems列表更早出现。(如果最后一个元素是sortedList,之后不进行任何处理,只需将列表传入两次。)

最新更新