我想创建具有排序和过滤功能的用户视图(表)。我使用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(带有排序的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
问题是:什么型号更好。或者两者都错了,创建视图有什么用?
答案 0 :(得分:1)
如果你使用DefaultEventTableModel everthing是好的。由于模型在EventList源上注册分类器。这是在你的第二个清单中内部完成的。如果您手动注册分拣机,则必须实施所有代码才能更改比较器(例如asc,desc)。当尝试使用过滤它时,但是JXTable imho不支持这种机制,所以你必须以自己的方式做到这一点。
答案 1 :(得分:0)
我投票给GlazedLists,因为它有效。是的,您与表一起使用的TableModel与视图紧密耦合,但您将该表模型与源数据分离
。GlazedLists的排序和过滤功能比JXTable上的功能灵活得多。只要确保你没有打开它们,或者事情会变得混乱。这是我使用带有JXTable的SortedList的常用代码片段:
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;
}
这是做什么的:
请注意,您传入两个事件列表,一个是管道末尾列表的displayItems,以及一个用于控制哪个列用于排序的sortedList,它可以在管道比displayItems列表。 (如果您的最后一个元素是sortedList,之后没有任何处理,只需将列表传递两次。)