2016-08-17 78 views
0

是否有一種將默認第二排序添加到JavaFX SortedList的好方法?我想要做的是允許用戶按照默認值單擊列標題,但是如果第一列未被選中,我的第一列的值將成爲決勝因素。我寧願這樣做,而仍然綁定到TableView comparatorProperty。對兩個值排序JavaFX SortedList

我想實現的類似下面的東西:

SortedList<MyObj> sortedData = new SortedList<>(myFilteredList); 
sortedData.comparatorProperty().bind(myTableView.comparatorProperty()/*.thenComparing(otherComparator) or something like this*/); 

是否有一個TableView中像這樣的只讀comparatorProperty的頂部結合的方法嗎?有沒有更好的辦法?

+0

'TableView'已經支持由多個columns.By排序抱着'Shift'您可以添加輔助排序,也見['TableView.getSortOrder()'](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html#getSortOrder--) – fabian

+0

這是真的,但我想爲我的用戶創建一個默認的平局,而不需要額外的步驟。 – Agricola

回答

0

這是一個有點笨重,但它似乎或多或少做你在找什麼。重點是,如果您使用排序列表並允許單擊標題,則需要將排序列表的比較器綁定到表格的比較器。

所以我認爲最好的選擇是修改表中定義的排序順序。這裏有一個簡單的方法:

TableColumn<S,T> defaultSortColumn = ... ; 
sortedList.comparatorProperty().bind(table.comparatorProperty()); 

// Added an extra '>' for syntax 
table.getSortOrder().addListener((Change<? extends TableColumn<S,?>> c) -> { 
    if (table.getSortOrder().size() != 2 || table.getSortOrder().get(1) != defaultSortColumn) { 
     table.getSortOrder().setAll(table.getSortOrder().get(0), defaultSortColumn); 
    } 
}); 

(顯然取代ST通過適當的類型)

+0

這編譯並運行,但它導致列標題顯示無響應。有沒有明確解決這個問題? – Agricola

+0

@Agricola查看更新...不知道這是你在找什麼,但它可能會給你一個開始。感覺有點黑客。 –