在JavaFX中,绑定comboBox项和表Column排序

时间:2013-11-02 09:19:47

标签: javafx-2

我有一个组合框和一个表视图。 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);
                }
            }
        });
}

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

2 个答案:

答案 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() );

                    } 
                }

            }