Добавление кнопки со значком в заголовки столбцов для ControlsFX TableFilter

Я реализовал ControlFF TableFilter с открытым исходным кодом в проекте, над которым я работаю.

Если вы посмотрите на документацию, то поймете, что нет значка, который бы позволил пользователю узнать, что есть опция фильтра для столбца. Вместо этого вы должны щелкнуть правой кнопкой мыши заголовок столбца, чтобы активировать функцию фильтра. Очевидно, что это не лучший вариант с точки зрения юзабилити - пользователю необходимо четко указать, что щелчок правой кнопкой мыши активирует функцию фильтра, в противном случае он понятия не имеет об этом.

У меня вопрос, есть ли способ реализовать кнопку значка для каждого заголовка столбца, который активирует TableFilter? Примером может служить этот проект.

Вы заметили, что в этой реализации значок песочных часов четко показан пользователю. Однако этот проект не содержит какой-либо закулисной логической реализации, необходимой для фильтра, в то время как ControlsFX один об этом позаботился. Если есть способ добавить значок песочных часов заголовка столбца стиля проекта GitHub в фильтр ControlsFX, я был бы очень признателен за решение! Спасибо вам большое!

1 ответ

Примечание: это не полный ответ на вопрос - просто слегка вспыхнувший комментарий о том, как подключиться к controlfx TableFilter!

Задача, о которой идет речь, состоит в том, чтобы изменить управляющий элемент TableFilter так, чтобы

  • каждый столбец имеет визуальный элемент, указывающий, что он фильтруется
  • активация этого визуального элемента должна открыть фильтр, чтобы позволить ввод пользователя

По умолчанию столбец не имеет индикатора, а панель фильтра открывается щелчком правой кнопкой мыши в заголовке.

Моя первая идея - использовать кнопку как графику и начать фильтрацию в ее обработчике действий - оказалось не так просто, как я ожидал: у TableFilter, похоже, нет API для доступа к фильтрам столбцов или для запуска / запуска фильтрации программно (или возможно я просто не нашел это).

Используя детали реализации, которые пользовательский интерфейс фильтра отображает в столбце contextMenu, рабочий подход в обработчике действий похож на

  • найдите TableColumnHeader (иначе: регион, это визуальное представление столбца)
  • найти экранные координаты этого региона
  • откройте контекстное меню столбца

Фрагмент ниже представляет собой PoC для fx8 (внутренняя часть действительно изменилась для 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, чтобы пометить столбец как фильтруемый. Мы могли бы взять эту графику и подключить к ней обработчик мыши, чтобы позволить открыть интерфейс фильтра... но с точки зрения UX это ужасно, так как будет один значок с двумя ролями...

Другие вопросы по тегам