java - 如何覆盖 TableView 中的排序行为

标签 java tableview javafx

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

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

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

最佳答案

我得到了一个丑陋的解决方案,它只解决了一半的问题。我可以将监听器附加到列标题单击事件,但无法删除默认的 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();
    }
}

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

关于java - 如何覆盖 TableView 中的排序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12551957/

相关文章:

ios - 在选定的表格行上启用图像

ios - 如何在 Swift 中获取选定行的值?

打包后 JavaFX 抛出图像错误

java - 使用java和Android提取bbcode引用但不提取引用标签内的内容

java - 在 Google App Engine 中使用 Java,存储和访问大型静态数据的最佳方式是什么?

java - JUnit 与 Rails Fixtures 并行吗?

java - NoClassDefFoundError : com. actionbarsherlock.app.SherlockFragmentActivity 版本 4

ios - 无法将图像传递到另一个 View (异步后)

javac 在当前文件夹中找不到另一个已编译的类

java - 如何在 javafx 中正确缩放控件和布局