我已经在我正在从事的一个项目中实现了开源ControlsFX TableFilter。
如果您查看文档,就会发现没有让用户知道列有筛选选项的图标。相反,您必须右键单击列标题才能激活筛选功能。显然,这在可用性方面并不是最好的--用户必须明确地被告知,右键单击将激活过滤器功能,否则他们根本不知道。
我的问题是,有没有办法为每个列标题实现一个图标按钮来激活TableFilter?下面的project就是一个例子。
您会注意到,在此实现中,沙漏图标清晰地显示给用户。然而,这个项目不包含过滤器所需的任何幕后逻辑实现,而ControlsFX one已经处理了所有这些。如果有一种方法可以将GitHub项目的样式列标题沙漏图标添加到ControlsFX过滤器中,我将不胜感激!非常感谢!
发布于 2018-08-08 21:47:57
注意:这并不是对这个问题的完整回答--只是对如何连接到控件on的略微闪现的评论!
问题中的任务是修改controlsfx TableFilter,以便
默认情况下,该列没有指示器,通过右击标题打开筛选器面板。
我的第一个想法-使用按钮作为图形并在其操作处理程序中开始过滤-结果并不像我预期的那么简单: TableFilter似乎没有任何api来访问列过滤器或以编程方式触发/开始过滤(或者我只是没有找到它)。
利用列的contextMenu中显示的过滤器ui的实现细节,操作处理程序中的工作方法类似于
下面的代码片段是fx8的PoC (fx9的内部结构确实发生了很大的变化!)并且可以通过复制到FlightTable示例中进行测试:
Button filterButton = new Button("Y");
filterButton.setOnAction(e -> {
TableHeaderRow header = ((TableViewSkin<?>) table.getSkin()).getTableHeaderRow();
TableColumnHeader columnHeader = header.getColumnHeaderFor(flightNumCol);
Bounds localBounds = columnHeader.getBoundsInLocal();
double xl = (localBounds.getMaxX() - localBounds.getMinX()) / 2;
double yl = localBounds.getMaxY();
Point2D p = columnHeader.localToScreen(xl, yl);
flightNumCol.getContextMenu().show(table, p.getX(), p.getY());
});
flightNumCol.setGraphic(filterButton);实际上并不起作用:该图形被TableFilter用来将列标记为已过滤。我们可以抓取该图形,并在其上挂接鼠标处理程序,以允许打开过滤器ui……但从UX的角度来看,这很糟糕,因为将有一个图标具有两个角色……
https://stackoverflow.com/questions/51714391
复制相似问题