Статьи

Sacrilege — пользовательская полоса прокрутки SWT

SWT — это тонкий слой абстракции поверх родных виджетов ОС. Что очень хорошо, если вы намерены, чтобы ваши приложения хорошо интегрировались с внешним видом ОС. Но в качестве компромисса этот подход значительно ограничивает возможности моделирования.

В частности, я чувствую, что штатная полоса прокрутки SWT часто мешает более тонким макетам вида. Недавно, столкнувшись с этой проблемой, я попробовал собственный виджет полосы прокрутки SWT. Этот пост представляет результат — простой элемент управления ползунком, используемый в качестве замены ползунка SWT или наложения Scrollbar .

SWT Scrollbar

Абстракция полосы прокрутки ОС SWT имеет два проявления: org.eclipse.swt.widgets.Scrollbar и org.eclipse.swt.widgets.Slider . Различия между обоими виджетами объясняются в следующем отрывке JavaDoc :

«Полосы прокрутки не являются элементами управления. На некоторых платформах полосы прокрутки, которые появляются как часть некоторых стандартных элементов управления, таких как текст или список, не имеют ресурсов операционной системы и не являются дочерними элементами элемента управления. По этой причине полосы прокрутки обрабатываются специально . Чтобы создать элемент управления, который выглядит как полоса прокрутки, но имеет ресурсы операционной системы, используйте Slider. ‘

Это означает, что Slider обеспечивает, по крайней мере, минимум программного влияния, например, устанавливает свои границы. Но производные org.eclipse.swt.widgets.Scrollable (суперкласс всех элементов управления со стандартными полосами прокрутки) просто предоставляют Scrollbar абстракции только для чтения.

Который по-прежнему очень полезен, например, для реагирования на события прокрутки, но практически не оставляет места для настройки внешнего вида. А область применения ползунков обычно ограничена пользовательскими компонентами, которые по каким-либо причинам не могут использовать полосы прокрутки, предоставляемые суперклассом Composite .

FlatScrollBar

Хотя нужно было преодолеть некоторые кроссплатформенные препятствия, создание собственного слайдера было простым. На следующем рисунке показан собственный ползунок в левой оболочке по сравнению с FlatScrollBar управления FlatScrollBar используемым в правой оболочке (ОС: Windows 7):

flatscrollbar

Следует отметить, что пользовательский ползунок расширяется при наведении курсора мыши, как показано вертикальной чертой. Горизонтальная полоса изображает компактный базовый внешний вид как сдержанный большой палец и индикатор выбора. В целом FlatScrollBar имитирует поведение, семантику и API Slider/Scrollbar :

слайдер-мимикрия

Очевидно, я решил опустить кнопки со стрелками вверх и вниз, но это всего лишь оптическая настройка. Хотя кнопки со стрелками еще не настраиваются, их можно восстановить, изменив одно постоянное значение в исходном коде.

ScrollableAdapter

Но как насчет полос прокрутки производных Scrollable таких как текст, дерево, таблицы или тому подобное? Будучи частью самого контроля ОС, как указано выше, они просто не подлежат замене. Теоретически можно было бы деактивировать прокрутку и использовать какую-то пользовательскую прокрутку для моделирования поведения прокрутки. Но это имеет несколько недостатков. Я попробовал этот подход, и результаты не были удовлетворительными.

Однако оборачивание прокрутки в накладываемый композитный адаптер кажется более перспективным. До сих пор я был в состоянии успешно адаптироваться к элементам управления Tree и Table .

таблицы прокрутки-накладка

А вот так выглядит создание адаптера:

1
new FlatScrollBarTable( parent, ( adapter ) -> new Table( adapter, SWT.NONE ) );

Достаточно просто, не правда ли? Второй параметр — это универсальная фабрика ( ScrollableFactory<T extends Scrollable> ), которая позволяет адаптироваться к различным прокручиваемым типам. Но поскольку реализация общего оверлея невозможна вообще, на данный момент доступны только деревья и адаптеры таблиц.

Адаптер обеспечивает доступ к экземпляру таблицы методом FlatScrollBarTable#getTable() . Это позволяет без проблем адаптироваться также к средствам просмотра деревьев и таблиц JFace .

Поскольку встроенные полосы прокрутки в Mac OS выглядят приемлемыми из коробки, адаптер воздерживается от пользовательских наложений на этой платформе. Это касается только платформ Gtk и MS Windows. Следовательно, нет скриншота Mac в заголовке изображения. Однако сам элемент управления FlatScrollBar хорошо работает и в OS X.

Вывод

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

Мне любопытно посмотреть, насколько устойчивым будет этот подход и возможно ли его адаптировать также к элементам управления текстом и / или стилю текста. Если вы хотите проверить элементы управления, они являются частью функции com.codeaffine.eclipse.swt репозитория Xiled P2, доступной по адресу:

Если вы хотите взглянуть на код или подать проблему, вы также можете взглянуть на проект Xiled GitHub. Ищите FlatScrollbarDemo , FlatScrollBarTreeDemo и FlatScrollBarTableDemo для примеров использования: