0

我想创建具有排序和过滤功能的用户视图(表)。我使用 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

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

4

2 回答 2

1

如果您使用 DefaultEventTableModel 一切都可以。当模型在 EventList 源上注册排序器时。它是在您的第二个列表中在内部完成的。如果您手动注册排序器,那么您必须实现所有代码才能更改比较器(例如 asc、desc)。当尝试使用过滤时,它是相同的,但是 JXTable imho 不支持这种机制,所以你必须以你自己的方式来做这件事。

于 2011-10-22T12:32:39.377 回答
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;
}

这是做什么的:

  • 打开 JXTable 右上角的列选择器小工具
  • 关闭 JXTable 的内置排序
  • 改为安装 GlazedLists 的排序功能
  • 使用派生自 TableFormat 的 EventTableModel 设置表

请注意,您传入了两个EventList,一个 displayItems 是管道末尾的列表,一个 sortedList 用于控制用于排序的列,它可以在管道中比 displayItems 列表更早。(如果你的最后一个元素是 sortedList,之后没有任何处理,只需将列表传递两次。)

于 2011-12-02T19:57:49.827 回答