gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:51:43 25 4
gpt4 key购买 nike

我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com