0

コンボボックスとテーブルビューがあります。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);
                }
            }
        });
}

誰かがデモ コードを共有できれば、役に立ちます。

4

2 に答える 2

2

TableView の変更順序への変更をリッスンする 2 番目のリスナーが必要です。をリッスンするには 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 に答える