【问题标题】:How to override sort behaviour in TableView如何覆盖 TableView 中的排序行为
【发布时间】:2012-09-15 03:23:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: java tableview javafx


    【解决方案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();
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多