Виджеты

SWT предоставляет множество возможностей, но для реализации надежного и полезного приложения необходимо знать ключевые элементы системы - виджеты, макеты и события.

Структура приложения виджета

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

Если вы разрабатываете приложение SWT с нуля без использования рабочей среды, то вам необходимо знать структуру приложения SWT.

Структура обычного автономного приложения SWT следующая:

Следующий фрагмент кода взят из приложения org.eclipse.swt.examples.helloworld.HelloWorld2 и немного изменен. Так как приложение отображает только строку "Hello World,", регистрация событий виджетов в нем не нужна.

   public static void main (String [] args) {
      Display display = new Display ();
      Shell shell = new Shell (display);
      Label label = new Label (shell, SWT.CENTER);
      label.setText ("Hello_world");
      label.setBounds (shell.getClientArea ());
      shell.open ();
      while (!shell.isDisposed ()) {
         if (!display.readAndDispatch ()) display.sleep ();
      }
      display.dispose ();
   }

Display

Класс Display представляет собой мостик между SWT и системой GUI платформы. Обычно экраны используются для управления циклом событий платформы и контроля связи нити UI с остальными нитями. (Полное описание управления нитями UI см. в разделе Работы с нитями для клиентов.)

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

Оболочка

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

Предки и потомки

У всех виджетов, не являющихся оболочками верхнего уровня, должны быть предки. У оболочек верхнего уровня предков нет, но они при создании связываются с конкретным окном (Display).К этому окну можно обратиться с помощью getDisplay(). Все остальные виджеты создаются как потомки (прямые или непрямые) оболочек верхнего уровня.

Виджеты Composite - это те виджеты, которые могут иметь потомков.

Окно приложения можно назвать деревом виджетов или иерархией, чьим корнем является оболочка. В зависимости от сложности приложения потомков может быть один или несколько, или даже многоуровневые составные виджеты с потомком.

Особенности стилей

Некоторые свойства виджета указываются при его создании и изменению уже не подлежат. Например, список может быть одиночный или с множественным выбором, с полосой прокрутки или без.

Эти свойства называются стилями и задаются в конструкторе. Все конструкторы виджетов получают аргумент int, который указывает поразрядную маску ИЛИ всех желаемых стилей. В некоторых случаях стиль считается подсказкой. Это означает, что он может поддерживаться не всеми платформами, и в тех платформах, которые его не поддерживают, будет проигнорирован.

Константы стилей находятся в классе SWT в виде общих статических полей. Список применимых констант для каждого класса виджета можно найти в справочнике по API для SWT.

Освобождение ресурса

При работе с SWT платформы требуют явного выделения и освобождения ресурсов ОС. Согласно принципу проектирования SWT, отражающему структуру приложения платформы в инструментарии виджета, в SWT требуется явно освобождать выделенные ресурсы ОС. В SWT для освобождения ресурсов, связанных с конкретным объектом инструментария используется метод Widget.dispose().

Практическое правило: если вы создали объект, вы должны его удалить. Ниже приведены несколько основных правил удаления объектов:

У этих правил есть только одно исключение. Простые объекты данных, например, Прямоугольник и Точка, не используют ресурсы операционной системы. Они не поддерживают метод dispose(), и их удалять не нужно. В случае сомнений посмотрите документацию Javadoc для конкретного класса.

В качестве продолжения этого раздела перейдите к разделу Управление рабочими ресурсами.