2013-11-02 87 views
0

我有一個組合框和一個表視圖。組合框項目用表格列名填充。我想要綁定comboBox項目選擇和表列排序。 示例:如果我從組合框的索引0處選擇項目說「名稱」,則對錶的第0列進行排序。 再次,如果我排序表中的一列,comboBox選擇的項目應更新與相應的列名稱。 現在我正在實現基於組合框項目選擇與下面的代碼的表列排序。在JavaFX中,綁定組合框項目和表列排序

private void bindComboBoxAndTableColumnSort() { 
     ComboBox combo = topComboBarController.getSortCombo(); 
     combo.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() { 

      @Override 
      public void changed(ObservableValue<? extends Number> arg0, 
        Number oldVal, Number newVal) { 
       System.out.println("oldVal = "+ oldVal + " and newVal = "+ newVal); 

       TableColumn sortColumn = null; 
       SortType st = null ; 
       sortColumn = table.getColumns().get(newVal.intValue()) ; 
       st = table.getColumns().get(newVal.intValue()).getSortType() ; 
       table.getSortOrder().clear(); 
       if(sortColumn != null){ 
        table.getSortOrder().add(sortColumn); 
        sortColumn.setSortType(SortType.ASCENDING); 
       } 
      } 
     }); 
} 

如果有人可以分享一些演示代碼,這將是有幫助的。

回答

2

您需要第二個監聽器來監聽TableView的更改順序。注意需要while循環來聽取paramChange。與你結合你的ComboBox

tableView.getSortOrder().addListener(new ListChangeListener<TableColumn<ColumnClass, ?>>() { 
    @Override public void onChanged(Change<? extends TableColumn<ColumnClass, ?>> paramChange) { 
     while(paramChange.next()) { 
      if (paramChange.wasPermutated()) { 
       final TableColumn<ColumnClass, ?> first = paramChange.getList().get(0); 
       final String tableColumnName = first.getText(); 
       ... 
      } 
     } 
    } 
}); 

編輯

根據要求一些其他的辦法

final ComboBox<String> box = new ComboBox<>(); 
table.getSortOrder().get(0).textProperty().bindBidirectional(box.valueProperty()); 
+0

感謝您的時間和建議。我可以採用這種方法,但這不是基於綁定。我想知道是否有辦法使用綁定來做到這一點? – Dil

+0

我編輯了我的答案,嘗試一個。但我不建議它,因爲它只會觸發一次。您需要聽取訂單更改。 – thatsIch

+0

請檢查您的上次編輯。它無論如何都不起作用。事實上,它在表格中引起了許多意想不到的行爲。如果可能,請在獨立代碼中檢查並重新編輯或刪除該更改,否則會混淆其他代碼。 – Dil

0

下面的代碼替換...,我能夠實現@thatslch提出什麼。

table.getSortOrder().addListener(new ListChangeListener<TableColumn<Person, ?>>(){ 

      @Override 
      //public void onChanged(javafx.collections.ListChangeListener.Change<? extends TableColumn<Person, ?>> paramChange) { 
      public void onChanged(Change<? extends TableColumn<Person, ?>> paramChange) { 
       // TODO Auto-generated method stub 
       while(paramChange.next()) { 
        if (paramChange.wasAdded()) { 
         System.out.println("paramChanged.wasAdded() "); 
         ComboBox combo = topComboBarController.getSortCombo(); 
         combo.valueProperty().bind(paramChange.getList().get(0).textProperty()); 

        } 
       } 

      }