繁体   English   中英

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

[英]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;
}

这是做什么的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM