[英]Views sorting and filtering: GlazedList sorting and filtering + JTable vs Glazed event list+JXTable
我想创建具有排序和过滤功能的用户视图(表)。 我使用EventList( Glazed Lists )作为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(带有Sorting的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源上注册排序器时。 它在内部完成,如您的第二个清单中所示。 如果您手动注册分类器,则必须实现所有代码才能更改比较器(例如,asc,desc)。 尝试使用相同的过滤器时,但是JXTable imho不支持此机制,因此您必须以自己的方式进行。
我投票给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;
}
这是做什么的:
请注意,您传入了两个 EventList,一个是displayItems,它是管道末尾的列表,另一个是sortedList,用于控制哪一列用于排序,可以在管道中早于displayItems列表。 (如果最后一个元素是sortedList,此后没有任何处理,则只需将列表传递两次。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.