Всегда в поисках эффективности Я в последнее время пересматривал удобство использования SWT FormLayout . Хотя это одна из моих любимых основных схем в отношении гибкости, я должен был признать, что она неохотно используется большинством моих коллег по работе. Предложение ее для соответствующей задачи иногда действительно причиняет настоящую физическую боль, учитывая реакции на лицо …
Действительно, при ближайшем рассмотрении нужно признать, что использование по крайней мере немного громоздко. Не столько сам макет, сколько конфигурация FormData для каждого FormData управления в FormData его досягаемости. В следующем фрагменте приведен простой пример использования, который … ну, я не буду портить удовольствие от самостоятельного выяснения того, что он делает:
|
1
2
3
4
5
6
7
|
Label label = new Label( composite, SWT.NONE );FormData labelData = new FormData();label.setLayoutData( labelData );labelData.top = new FormAttachment( 0 );labelData.right = new FormAttachment( 100 );labelData.bottom = new FormAttachment( 100 );labelData.left = new FormAttachment( 0 ); |
Конечно, каждый может понять функциональность кода. Но у него действительно есть идея выяснить это — и я думаю, что это часть проблемы. Так как насчет программирования это менее многословно, но, тем не менее, более выразительно следующим образом:
|
1
2
|
Label label = new Label( composite, SWT.NONE );attach( label ).atTop().atRight().atBottom().atLeft(); |
Хотя он определенно более компактен, выразительность, по крайней мере, в некоторой степени, в глазах смотрящего и сильно зависит от метафоры, стоящей перед поставленной задачей. В моем воображении FormLayout основном прикрепляет границы FormLayout управления в определенных контрольных точках, то есть к верхней стороне atTop , что означает, что он всегда удерживает верхнюю сторону элемента управления на верхней границе клиентской области родителя.
Или же он прикрепляет элемент управления сверху другого элемента управления, а это означает, что верхняя сторона элемента управления всегда выровнена с нижней частью другого элемента управления. Кроме того, сторона может быть присоединена к процентному диапазону от соответствующей границы клиентской области, что может быть выражено так:
|
1
|
attach( control ).atLeftTo( otherControl ).fromTop( 20 ); |
С этим мышлением я разработал небольшой служебный класс под названием FormDatas чтобы реализовать изложенные идеи на практике. Класс предоставляет статический метод attach для создания нового экземпляра FormData , который зарегистрирован в элементе управления, заданном в качестве параметра. Экземпляр данных макета возвращается обернутым объектом FormDatas чтобы включить свободный интерфейс стилей методов конфигурации 1 .
Кроме того, существуют перегруженные варианты методов для обработки, например, понятия поля или выравнивания . Поля основаны на базовом атрибуте Attachment#offset , но фактически учитывают сторону вложения. Следовательно, поле 5 atRight соответствует смещению -5 Attachment , которое было присвоено FormData#right с числителем 100:
|
1
|
attach( label ).atRight( 5 ); |
коротка для
|
1
2
3
|
FormData formData = new FormData();label.setLayoutData( formData );formData.right = new FormAttachment( 100, -5 ); |
Выравнивание поддерживается атрибутом Attachment#alignment и использует соответствующие константы SWT. Например, чтобы настроить верхнее вложение элемента управления в центр другого элемента управления, используйте следующий код:
|
1
|
attach( control ).atTopTo( otherControl, MARGIN, SWT.CENTER ); |
И вот еще один сценарий, который показывает, как работать с подсказкой ширины вместо противоположных боковых вложений:
|
1
|
attach( control ).atTop().atRight().atBottom().withWidth( WIDTH ); |
Важно отметить, что реализация FormDatas не охватывает все возможности FormData и FormAttachment . Но так как мне удалось заменить все варианты использования в текущем проекте, я надеюсь, мне удалось встретиться с более распространенными.
С точки зрения IDE лучший способ интегрировать FormDatas — это настроить его в качестве избранного . Таким образом, метод FormDatas.attach(Control) доступен через помощник по содержимому, который автоматически обрабатывает статический импорт и тому подобное.
Если вы хотите взглянуть на FormDatas самостоятельно, есть GitHub, содержащий реализацию. Однако имейте в виду, что я не тратил время на документацию, проверку параметров или тому подобное. В этом отношении утилита является довольно грубой версией, которая может развиваться со временем.
https://gist.github.com/fappel/9867945
Сущность содержит FormDatas и контрольный пример JUnit , так как реализация предназначена для использования в производственной среде и поэтому должна быть проверена.
-
FormDatas#attach(Control)по сути является фабричным методом. Из-за этого может показаться немного странным возвращение экземпляраFormDatas. Тем не менее, введение нового типа только ради свободного стиля интерфейса также показалось мне немного странным — так что если у вас есть идея получше … ↩
| Ссылка: | Уменьшите SWT FormLayout Usage от нашего партнера JCG Фрэнка Аппеля в блоге Code Affine . |
