在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());
答
下面的代码替换...
,我能够实现@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());
}
}
}
感谢您的时间和建议。我可以采用这种方法,但这不是基于绑定。我想知道是否有办法使用绑定来做到这一点? – Dil
我编辑了我的答案,尝试一个。但我不建议它,因为它只会触发一次。您需要听取订单更改。 – thatsIch
请检查您的上次编辑。它无论如何都不起作用。事实上,它在表格中引起了许多意想不到的行为。如果可能,请在独立代码中检查并重新编辑或删除该更改,否则会混淆其他代码。 – Dil