我已经实现了开源ControlsFX TableFilter我正在从事的一个项目。
如果您查看文档,您会发现没有任何图标可以让用户知道某个列有一个过滤器选项。相反,您必须右键单击列标题才能激活过滤器功能。显然,这在可用性方面并不是最好的 - 必须明确告知用户右键单击将激活过滤器功能,否则他们不知道。
我的问题是,有没有办法为每个列标题实现一个图标按钮来激活 TableFilter?一个例子是 project .
您注意到,通过此实现,沙漏图标清楚地显示给用户。然而,该项目不包含过滤器所需的任何幕后逻辑实现,而 ControlsFX 已经解决了这一切。如果有办法将 GitHub 项目的样式列标题沙漏图标添加到 ControlsFX 过滤器中,我将不胜感激!非常感谢!
最佳答案
注意:这不是问题的完整答案 - 只是关于如何挂接到controlsfx TableFilter 的稍微闪现的评论!
问题中的任务是修改controlsfx TableFilter,以便
- 每列都有一个视觉元素来指示它是可过滤的
- 激活该视觉元素应打开过滤器以允许用户输入
默认情况下,该列没有指示器,并且通过右键单击标题打开过滤器面板。
我的第一个想法 - 使用按钮作为图形并在其操作处理程序中开始过滤 - 结果并不像我预期的那么简单:TableFilter 似乎没有任何 api 来访问列过滤器或触发/开始过滤以编程方式(或者也许我只是没有找到它)。
利用过滤器 ui 在列的 contextMenu 中显示的实现细节,操作处理程序中的工作方法类似于
- 找到 TableColumnHeader(又名:作为列的可视化表示的区域)
- 查找该区域的屏幕坐标
- 打开列的上下文菜单
下面的代码片段是 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 使用该图形将列标记为正在过滤。我们可能会抓取该图形并在其上挂上一个鼠标处理程序以允许打开过滤器用户界面...但从用户体验的角度来看,这很糟糕,因为一个图标具有两个角色...
关于java - 将图标按钮添加到 ControlsFX TableFilter 的列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51714391/