我有一个组合框和一个表视图。 ComboBox项目用表格列名填充。我想绑定comboBox项目选择和表列排序。 示例:如果我从comboBox中选择项目说“名称”,它位于comboBox的索引0处,则对表的第0列进行排序。 再次,如果我对表中的列进行排序,则comboBox所选项应该使用相应的列名更新。 现在我正在使用以下代码实现基于comboBox项目选择的表列排序。
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);
}
}
});
}
如果有人可以分享一些演示代码,那将会有所帮助。
答案 0 :(得分:2)
您需要第二个侦听器来侦听对TableView的changeorder的更改。注意需要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());
修改强>
根据要求采取其他一些方法
{{1}}
答案 1 :(得分: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() );
}
}
}