Как переопределить поведение сортировки в TableView

My TableView заполняет данные из базы данных. Когда пользователь щелкает заголовок столбца, он сортирует данные на его основе. Эта функция находится вне коробки. Однако у меня слишком много записей, чтобы заполнять их за раз. Скажем, у меня 1000 записей, а таблица показывает только 500. Когда я сортирую ее по столбцу, она сокращает только 500 уже заполненных записей.

Я хотел бы переопределить поведение сортировки, чтобы, когда пользователь щелкает заголовок столбца, он перезагружает данные из базы данных и предоставляет необходимую информацию для предложения «порядок по» в запросе. Моя проблема в том, что я не знаю

  1. Как отключить существующее поведение сортировки. Я могу установить для свойства sortable столбца значение false, но я боюсь, что это делает заголовок неактивным.
  2. Как прикрепить слушателя для прослушивания события щелчка заголовка столбца. Правильно ли tableView.getSortOrder (). AddListener ()?

person amru    schedule 23.09.2012    source источник


Ответы (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();
    }
}

Я хотел бы услышать ваше мнение / комментарий по этому поводу.

person amru    schedule 24.09.2012