在JavaFX中,绑定组合框项目和表列排序

问题描述:

我有一个组合框和一个表视图。组合框项目用表格列名填充。我想要绑定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); 
       } 
      } 
     }); 
} 

如果有人可以分享一些演示代码,这将是有帮助的。

您需要第二个监听器来监听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

下面的代码替换...,我能够实现@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()); 

        } 
       } 

      }