簡體   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