5

私のTableViewはデータベースからデータを取り込みます。ユーザーが列ヘッダーをクリックすると、それに基づいてデータが並べ替えられます。この機能はすぐに使用できます。ただし、一度に入力するにはレコードが多すぎます。1000 のレコードがあり、テーブルには 500 しか表示されないとします。列に基づいて並べ替えると、既に入力されている 500 のレコードのみが短縮されます。

ユーザーが列ヘッダーをクリックすると、データベースからデータがリロードされ、クエリの「order by」句に必要な情報が提供されるように、並べ替え動作をオーバーライドしたいと思います。私の問題は、わからないということです

  1. 既存のソート動作をオフにする方法。列の sortable プロパティを false に設定できますが、ヘッダーをクリックできなくなるのではないかと心配しています。
  2. 列ヘッダーのクリック イベントをリッスンするリスナーをアタッチする方法。tableView.getSortOrder().addListener() は正しい方法ですか?
4

1 に答える 1

1

問題の半分しか解決しない醜い解決策を得ました。列ヘッダーのクリック イベントにリスナーをアタッチできますが、デフォルトの TableView の並べ替え動作を削除できません。

private void initTable() {
    ...
    ...
    //listen to sorting type (ASC/DESC) change
    SortTypeChangeListener sortTypeChangeListener = new SortTypeChangeListener();
    clmName.sortTypeProperty().addListener(sortTypeChangeListener);
    clmGender.sortTypeProperty().addListener(sortTypeChangeListener);
    reload();

    //listen to sortorder change
    tblMember.getSortOrder().addListener(new ListChangeListener<TableColumn<VOMember, ?>>() {
        @Override
        public void onChanged(Change<? extends TableColumn<VOMember, ?>> change) {
            reload();
        }
    });
}

private void reload() {
  /**
     * Get sorted columns and sorting versus (ASC/DESC)
     */
    List<String> lstSortedColumn = new ArrayList<String>();
    List<String> lstSortedType = new ArrayList<String>();
    for (TableColumn<VOMember, ?> tc : tblMember.getSortOrder()) {
        PropertyValueFactory valFactory = (PropertyValueFactory) tc.getCellValueFactory();
        valFactory.getProperty();
        lstSortedColumn.add(valFactory.getProperty());
        lstSortedType.add(tc.getSortType().name());
    }

/**
     * Retrieve data from database. Pass the sorting information
     */        
    List<VOMember> lstMember = controller.retrieve(lstSortedColumn, lstSortedType);
    ObservableList<VOMember> data = FXCollections.observableList(lstMember);
    tblMember.setItems(data);
}

class SortTypeChangeListener implements InvalidationListener {

    @Override
    public void invalidated(Observable o) {
        /**
         * If the column is not in sortOrder list, just ignore.
         * It avoids intermittent duplicate reload() calling
         */
        TableColumn col = (TableColumn) ((SimpleObjectProperty) o).getBean();
        if (!tblMember.getSortOrder().contains(col)) {
            return;
        }

        reload();
    }
}

これについてあなたの見解/コメントを聞きたいです。

于 2012-09-24T13:05:40.987 に答える