2016-04-19 56 views
1

這是我希望獲得答案的另一個JavaFX問題。目前,當您在TableView中對列進行排序時,您會從第一次點擊開始按升序排列,從第二次點擊開始遞減,然後在第三次點擊時它不執行任何操作,並且排序箭頭消失。我知道第三種排序模式應該將列返回到其先前未排序的狀態。我知道這種模式最近由於受歡迎的請求而被添加,但是有沒有辦法完全繞過它?也就是說,在第一次點擊時,我們按升序排序,第二次點擊我們按降序排序,就是這樣,第三次點擊會再次升序?是否有捷徑可尋?對TableView列進行排序:繞過「未排序」模式的方法

謝謝

+0

我試圖找到一個解決方案,但我沒有。請讓我們知道你是否發現了黑客! – mrbela

回答

-1

您是否嘗試將ChangeListener添加到列?

column.sortTypeProperty().addListener(new ChangeListener<javafx.scene.control.TableColumn.SortType>() { 
     @Override 
     public void changed(final ObservableValue<? extends javafx.scene.control.TableColumn.SortType> observable, 
       final javafx.scene.control.TableColumn.SortType oldValue, final javafx.scene.control.TableColumn.SortType newValue) { 
      if (oldValue==javafx.scene.control.TableColumn.SortType.DESCENDING) { 
       column.sortTypeProperty().set(javafx.scene.control.TableColumn.SortType.ASCENDING); 
      } 
     } 
    }); 

編輯:因爲上面的代碼不工作(見註釋),我建議如下:

Button columnHeader = new Button("column name"); 
columnHeader.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent arg0) { 
      if (column.getSortType()==SortType.DESCENDING) { 
       column.setSortType(SortType.ASCENDING); 
      } 
     } 
    }); 
column.setGraphic(columnHeader); 
+0

這不起作用,因爲如果用戶每三次單擊一次頭部,偵聽器都不會被觸發。 – mrbela

+1

好吧,那麼我能想到的唯一解決方案就是聽每一次點擊該列。這可以通過設置列標題的圖形來實現,例如column.setGraphic(new Button(「columnName」));並添加一個ActionListener到這個Button。 – Karl

+0

您可以使用此信息編輯您的答案,以便我可以將其恢復爲0. Thx。 – mrbela

0

由於當前JFX API的,這個問題唯一的解決方案如下: 創建新類,名爲MyTableView,它擴展了TableView,現在您可以根據您的方便重寫其現有的sort()方法。第三次點擊時,列表sortOrder將不會返回任何內容,其大小將爲零。此時,如果是第三次點擊,則可以跟蹤計數。請參閱附加的小代碼。

public class MyTableView<S> extends TableView { 
    private int countHeaderClick = -1 ; 

    @Override 
    public void sort(){ 
     final ObservableList<? extends TableColumn<S,?>> sortOrder = getSortOrder(); 

     countHeaderClick++ ; 
     super.sort(); 
     if(sortOrder.size() > 0) { 
      columnClicked = sortOrder.get(0).getId(); // name of column clicked 

      strSortTypeValue = sortOrder.get(0).getSortType().toString(); // ascending or descending 

     }else{ 
      <what ever you want to perform> 
     } 
} 

希望它有一點幫助。

0

以下是此問題的一個快速而骯髒的解決方案:

// global variables 
TableView<Object> table; 
TableColumn currentSortColumn; 

void initialize() { 
    // set default sort column 
    currentSortColumn = table.getColumns().get(0); 
    table.getSortOrder().setAll(currentSortColumn); 

    // update current sort column after sorting changes 
    for (TableColumn column : table.getColumns()) { 
    column.sortTypeProperty().addListener((observable, oldValue, newValue) -> { 
     currentSortColumn = column; 
    }); 
    } 
    // if table loses comparator restore the sort order! 
    table.comparatorProperty().addListener((observable, oldValue, newValue) -> { 
    if (newValue == null) { 
     table.getSortOrder().setAll(currentSortColumn); 
     if (currentSortColumn.getSortType().equals(TableColumn.SortType.ASCENDING)) { 
     currentSortColumn.setSortType(TableColumn.SortType.DESCENDING); 
     } else { 
     currentSortColumn.setSortType(TableColumn.SortType.ASCENDING); 
     } 
    } 
    }); 
} 
0

上的TableView的屬性中將sortOrder負責保存被示爲排序的列。 考慮到這一點,以確保一個列總是排序,這個屬性可以被觀察,並且每當它被發現不包含列時(例如在'第三次點擊'上),然後通過聽衆將其添加回來,如下所示:

TableColumn<?,?> aColumnThatMustAlwaysBeSorted = ...; 

tableView.getSortOrder().addListener((ListChangeListener<? super TableColumn<?,?>>)observable -> { 
    if(!tableView.getSortOrder().contains(aColumnThatMustAlwaysBeSorted)){ 
     aColumnThatMustAlwaysBeSorted.setSortType(SortType.ASCENDING); 
     tableView.getSortOrder().add(aColumnThatMustAlwaysBeSorted); 
    } 
}); 

getSortOrder().add(aColumnThatMustAlwaysBeSorted); 

移動點擊多列進行排序時的行爲起初看起來有點不同尋常,因爲在點擊另一列時,'always-sorted'列將成爲第二個排序索引,並且任何其他列將追加到後面。如果用戶想要索引進一步下移,那麼點擊'always-sorted'列將再次強制將其作爲最後的排序索引。

相關問題