Java 将图标按钮添加到ControlsFX TableFilter的列标题

Java 将图标按钮添加到ControlsFX TableFilter的列标题,java,javafx,controlsfx,Java,Javafx,Controlsfx,我已经在我正在从事的一个项目上实现了开源 如果您查看文档,就会发现没有图标可以让用户知道列有一个过滤器选项。相反,您必须右键单击列标题才能激活筛选功能。显然,这并不是可用性方面的最佳选择——用户必须明确地被告知右键单击将激活过滤器功能,否则他们不知道 我的问题是,有没有办法为每个列标题实现一个图标按钮来激活TableFilter?这就是一个例子 您注意到,在这个实现中,沙漏图标清晰地显示给用户。但是,该项目不包含过滤器所需的任何后台逻辑实现,而ControlsFXOne已经完成了所有这些。如果有

我已经在我正在从事的一个项目上实现了开源

如果您查看文档,就会发现没有图标可以让用户知道列有一个过滤器选项。相反,您必须右键单击列标题才能激活筛选功能。显然,这并不是可用性方面的最佳选择——用户必须明确地被告知右键单击将激活过滤器功能,否则他们不知道

我的问题是,有没有办法为每个列标题实现一个图标按钮来激活TableFilter?这就是一个例子


您注意到,在这个实现中,沙漏图标清晰地显示给用户。但是,该项目不包含过滤器所需的任何后台逻辑实现,而ControlsFXOne已经完成了所有这些。如果有办法将GitHub项目的样式列标题沙漏图标添加到ControlsFX过滤器,我将非常感谢您的解决方案!非常感谢你

注意:这不是对这个问题的完整回答-只是对如何连接到controlsfx TableFilter的一个略带闪现的评论

问题中的任务是修改controlsfx TableFilter,以便

  • 每个列都有一个可视元素,指示它是可过滤的
  • 激活该视觉元素应打开过滤器,以允许用户输入
默认情况下,列没有指示符,右键单击标题可打开过滤器面板

我的第一个想法——使用按钮作为图形并在其操作处理程序中开始过滤——结果并不像我预期的那样简单:TableFilter似乎没有任何api来访问列过滤器或以编程方式触发/开始过滤(或者可能我根本没有找到它)

利用列的上下文菜单中显示的过滤器ui的实现细节,操作处理程序中的工作方法如下

  • 查找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);
按钮过滤器按钮=新按钮(“Y”);
过滤器按钮设置操作(e->{
TableHeaderRow头=((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(表,p.getX(),p.getY());
});
flightNumCol.setGraphic(过滤器按钮);


实际上不起作用:TableFilter使用图形将列标记为已过滤。我们可能会抓取该图形并在其上钩住鼠标处理程序,以允许打开过滤器ui。。。但从用户体验的角度来看,这很糟糕,因为一个图标有两个角色

第二个只使用tableColumn的图形-为什么不在第一个中简单地执行相同的操作呢?。。。你如何将图形变成一个按钮,然后添加功能来激活ControlsFX过滤器?我不明白。。如果它是一个按钮,则设置其actionHandler并触发ControlsFX的过滤ControlsFX表过滤器会自动为您执行所有操作-即应用过滤器:
TableBuilder.TableFilter.forTableView(table).apply()
这会自动为每一列应用过滤器。当几乎所有过滤器的机制都在幕后时,如何设置actionHandler来激活过滤器?必须为ControlsFX筛选器添加的唯一代码是上面的行。必须执行的最小值;)必须有api触发这种魔力,读取代码,找到它并挂接到…解决方案一开始似乎确实有效,但TableFilter似乎在某种程度上劫持了TableColumns-一旦应用了筛选器,Y按钮就会消失,并且在该点之后无法取回它。arrghh。。查看发生的情况:图形用于将列标记为已过滤。。。嗯……也许你需要找到一种方法,在过滤列时显示相同的按钮而不是过滤图形?