Статьи

Slim Down SWT FormLayout Использование

Всегда в поисках эффективности Я в последнее время пересматривал удобство использования 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 , так как реализация предназначена для использования в производственной среде и поэтому должна быть проверена.

  1. FormDatas#attach(Control) по сути является фабричным методом. Из-за этого может показаться немного странным возвращение экземпляра FormDatas . Тем не менее, введение нового типа только ради свободного стиля интерфейса также показалось мне немного странным — так что если у вас есть идея получше …
Ссылка: Уменьшите SWT FormLayout Usage от нашего партнера JCG Фрэнка Аппеля в блоге Code Affine .