首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图标按钮添加到ControlsFX TableFilter的列标题

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

Stack Overflow用户
提问于 2018-08-07 03:24:59
回答 1查看 488关注 0票数 1

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

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

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

您会注意到,在此实现中,沙漏图标清晰地显示给用户。然而,这个项目不包含过滤器所需的任何幕后逻辑实现,而ControlsFX one已经处理了所有这些。如果有一种方法可以将GitHub项目的样式列标题沙漏图标添加到ControlsFX过滤器中,我将不胜感激!非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 21:47:57

注意:这并不是对这个问题的完整回答--只是对如何连接到控件on的略微闪现的评论!

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

  • 每列都有一个可视元素,用于指示该可视元素应打开筛选器以允许用户输入

默认情况下,该列没有指示器,通过右击标题打开筛选器面板。

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

利用列的contextMenu中显示的过滤器ui的实现细节,操作处理程序中的工作方法类似于

  • 查找TableColumnHeader (也称为:作为列的可视化表示的区域)
  • 查找该区域的屏幕坐标
  • 打开列的contextMenu

下面的代码片段是fx8的PoC (fx9的内部结构确实发生了很大的变化!)并且可以通过复制到FlightTable示例中进行测试:

代码语言:javascript
复制
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的角度来看,这很糟糕,因为将有一个图标具有两个角色……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51714391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档