如何在TableView中覆盖排序行为

时间:2012-09-23 11:30:15

标签: java tableview javafx

我的TableView填充数据库中的数据。当用户单击列标题时,它会根据它对数据进行排序。此功能是开箱即用的。但是,我有太多记录可以一次填充它们。假设我有1000条记录,而且表格只显示500条。当我根据列对其进行排序时,它只会缩短已经填充的500条记录。

我想覆盖排序行为,因此当用户单击列标题时,它将从数据库重新加载数据,并为查询中的“order by”子句提供必要的信息。我的问题是,我不知道

  1. 如何关闭现有的排序行为。我可以将列的可排序属性设置为false,但我担心它会使标题无法点击。
  2. 如何附加侦听器以侦听列标题单击事件。 tableView.getSortOrder()。addListener()是正确的方法吗?

1 个答案:

答案 0 :(得分: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();
    }
}

我想听听你对此的看法/评论。