0

我有一个组合框和一个表格视图。ComboBox 项目用表格列名填充。我想绑定组合框项目选择和表格列排序。示例:如果我从位于组合框索引 0 的组合框中选择项目说“名称”,则对表的第 0 列进行排序。同样,如果我对表中的列进行排序,则组合框所选项目应使用相应的列名进行更新。现在我正在使用下面的代码实现基于组合框项目选择的表格列排序。

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);
                }
            }
        });
}

如果有人可以分享一些演示代码,那将会很有帮助。

4

2 回答 2

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());
于 2013-11-02T10:46:12.887 回答
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() );

                    } 
                }

            }
于 2013-11-02T13:53:31.240 回答