Пакеты SWT и JFace, Часть 1: Небольшой обзор

Как создавать простые SWT-приложения

В первой статье о выпуске пакетов SWT и JFace вы найдете ответы на вопросы о том, как создавать простые приложения Standard Widget Toolkit (SWT) с использованием Java™, Eclipse, а также библиотек SWT и JFace. Также вы узнаете о том, как создавать простые графические интерфейсы пользователя SWT с использованием основных элементов управления и шаблонов.

Барри Фейгенбаум (Barry Feigenbaum), программист-констультант, IBM 

Барри Фейгенбаум (Barry Feigenbaum) является членом IBM Worldwide Accessibility Center, где он работает служащим команды, которая стремится сделать продукты IBM доступными для людей с ограниченными способностями. Он только что опубликовал несколько книг и статей, владеет несколькими патентами, а также председательствовал на отраслевых конференциях, таких как JavaOne. Он также работал помощником профессора вычислительных наук в Техасском университете, в Остине и других школах.



03.05.2005

Библиотеки Standard Widget Toolkit (SWT) и JFace используются для разработки графических интерфейсов пользователя (GUIs) в среде Eclipse, а также для разработки отдельных собственных графических интерфейсов приложений. В этой статье я приведу обзор некоторых основных типов SWT (это является названием основного объекта графического интерфейса) и покажу, как их можно объединять для создания действующего приложения.

Об Eclipse и пакетах SWT и JFace

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

Eclipse предоставляет разработчикам основу для разработки широкого управляемого графическим интерфейсом инструментария и приложений. Основной базой для этого являются библиотеки графических интерфейсов Eclipse SWT и JFace.

SWT – это библиотека, которая создает Java-представление графических элементов управления в базовой операционной системе. Она зависима от реализации хост системы. Это означает, что приложения, основанные на SWT, обладают следующими основными характеристиками:

  1. Они выглядят, работают и действуют в точности, как и "собственные" приложения.
  2. Предлагаемые widgets отображают widgets (компоненты и элементы управления), предлагаемые операционной системой.
  3. Любое особенное поведение графических библиотек хоста отражается в графическом интерфейсе SWT.

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

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

О данной серии статей

Эта серия статей о SWT и Jface включает в себя основные статьи по разработке приложений с использованием Standard Widget Toolkit (SWT) и библиотек JFace, которые поставляются с базовым пакетом программного обеспечения Eclipse software development kit (SDK). Особое внимание уделяется использованию SWT и JFace для разработки отдельных приложений. Однако, большинство примеров, которые вы изучите, может быть применимо и к Eclipse workbench.

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

Эта серия статей подразумевает, что вы знакомы с языком и разработкой в среде Java, а также имеете некоторое понимание о работе инструментария Java AWT или Swing GUI.

Перед тем, как мы начнем, необходимо ознакомиться с терминологией, применяемой в SWT:

  • Widget – основной компонент графического интерфейса SWT (сродни компоненту в пакете Java AWT и JComponent в Swing). Widget является абстрактным классом.
  • Элемент управления – это widget, который имеет сходный элемент в операционной системе (другими словами, имеет тождественный элемент в операционной системе). Данный элемент является абстрактным классом.
  • Композит – это элемент управления, который может заключать в себе другие элементы (сродни термину Контейнер в пакете Java AWT и JPanel в пакете Swing).
  • Объект – это widget, содержащийся в других элементах (которые могут и не быть композитами), например, таких как, список или таблица. Заметьте, что элементы управления, содержащие объекты, редко содержат еще и элементы и наоборот. Объект является абстрактным классом.

Эти widgets расположены в иерархическом наследуемом порядке. Смотрите рисунки 1, 2 и 3, показывающие, как это реализуется. На рисунке 2 класс Basic1 является классом, описанным в этой статье, а все другие классы – стандартные SWT widgets.

Рисунок 1. Дерево SWT Widget
Рисунок 1. Дерево SWT Widget
Рисунок 2. Дерево SWT Composite
Рисунок 2. Дерево SWT Composite
Рисунок 3. Список SWT объектов
Рисунок 3. Список SWT объектов

Заметьте, что хотя Eclipse является кросс-платформенным приложением (т.е. оно выполняется на многих операционных системах), данный материал основан на версии Eclipse для Microsoft® Windows®. Не смотря на это каждый пример, описанный в данном материале, должен без изменений выполняться на других платформах. Имейте ввиду также, что данный материал основан на версии Eclipse V3.0. В версии Eclipse V3.1 добавлено несколько новых типов widget GUI и свойств.

Установка SWT и JFace

Адрес сайта Eclipse можно найти в разделе Ресурсы. Для установки Eclipse и использования библиотек SWT в ваших приложениях выполните следующее:

  1. Со домашней страницы Eclipse перейти на страницу Downloads, затем выбрать неободимую версию Eclipse для вашей платформы, загрузить соответствующий ZIP-файл.
  2. Распакуйте ZIP-архив в самую верхнюю директорию. Я бы предложил в качестве имени директории "EclipseX.Y.Z", где X.Y.Z – это полная версия Eclipse.
  3. Воспользуйтесь командой DIR или поиском, чтобы найти файл swt.jar и поместить его в ваш CLASSPATH (или использовать в команде java –cp).
  4. Найдите все файлы SWT-*.DLL и проверьте, что они доступны (имя их каталога запишите в переменную PATH или же скопируйте файлы DLL в директорию, которая уже прописана в PATH).

Похожие шаги необходимо выполнить и в случае использования других платформ.

Основные элементы управления

Почти все графические интерфейсы SWT создаются из нескольких основных частей. Все SWT widgets могут быть найдены в пакетах org.eclipse.swt.widgets или org.eclipse.swt.custom (некоторые плагины Eclipse также предоставляют кастомизируемые widgets в других пакетах). В пакете widgets содержатся элементы управления, основанные на элементах управления операционной системы, в то время как кастомизируемый пакет содержит элементы управления в большем количестве, чем в наборе элементов операционной системы. Некоторые кастомизируемые элементы управления схожи с элементами пакета widgets. Для избежания конфликта имен названия кастомизируемых элементов начинаются с "C" (CLabel vs. Label).

Как требуется в SWT, все элементы управления (за исключением такиих элементов верхнего уровня, как shells, которые будут описаны позже) в момент инициализации должны включать элементы предка (композитные экземпляры). При инициализации элементы управления автоматически добавляются к предку, в то время как в AWT/Swing они должны быть явно указаны, реализуя нисходящий способ реализации графических интерфейсов. Таким образом, все элементы управления получают композитный родительский класс (или внутренний класс), как аргумент конструктора.

Большинство элементов имеют опции флага, которые должны быть установлены при создании. Таким образом, большинство элементов получает второй аргумент конструктора, часто называемый “Стиль”, который задает флаги для установки этих опций. Все значения флага имеют тип static final int и описываются в классе SWT в пакете org.eclipse.swt. Если ни одной опции не требуется, используйте значение SWT.NONE.


Метки

Самый простой для использования элемент управления – метка – служит для показа плоского (без цвета, специальных шрифтов и стилей) текста или небольшого изображения, называемого иконкой. Метки не получают фокус (другими словами, пользователь не может перемещать метку клавишей Тab или мышью) и, таким образом, не генерируют входных событий.

Листинг 1. Создание метки с текстом
import org.eclipse.swt.widgets.*;
 :
Composite parent =...;
 :
// create a center aligned label
Label label = new Label(parent, SWT.CENTER); 
label.setText("This is the label text");

Заметьте, что текстовая строка инициализируется отдельным методом конструктора. Это характерно для всех элементов SWT. Только родительский класс и стиль инициализируются в конструкторе, а все остальные параметры определяются в созданном объекте.

Из-за платформенных ограничений стандартные элементы управления не могут содержать строку и иконку одновременно. Для их совместного использования, примените элемент управления Clabel, как показано в листинге 2.

Листинг 2. Создание метки с текстом и изображением
import com.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.custom.*;
 :
Composite parent =...;
Image image =...;
 :
// create a left aligned label with an icon
CLabel Clabel = new CLabel(parent, SWT.LEFT); 
label.setText("This is the imaged label text"");
label.setImage(image);

Элементы редактирования текста

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

В листинге 3 показано, каким образом создается простое текстовое поле с ограничением по количеству символов. Текст, заданный по-умолчанию, выбран таким образом, чтобы разрешить легкое удаление.

Листинг 3. Создание текста с выбранным текстом по умолчанию и ограничением по символам
import org.eclipse.swt.widgets.*;
 :
Composite parent =...;
 :
// create a text field
Text name = new Text(parent, SWT.SINGLE); 
name.setText("<none>");
name.setTextLimit(50);
name.setToolTipText("Enter your name -- Last, First");
name.selectAll();  // enable fast erase

Кнопки

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

  • Стрелка (ARROW) – отображаеися в виде стрелки, направленной вверх, вниз, влево или вправо
  • Флажок (CHECK) – область, которую можно отметить
  • Плоская (FLAT) – обычная кнопка, но без рельефа
  • Нажатие (PUSH) – обыкновенная выпуклая кнопка (самое распространенное)
  • Переключатель(RADIO) – используется только вместе с другими элементами для выбора единственного варианта
  • Переключение (TOGGLE) – кнопка

Листинг 4 создает "Чистую" кнопку:

Листинг 4. Создание кнопки
import org.eclipse.swt.widgets.*;
 :
Composite parent =...;
 :
// create a push button
Button clear = new Button(parent, SWT.PUSH); 
clear.setText("Clea&r");

Символ & в имени вызывает создание акселератора с использованием последующего символа в имени, позволяющего нажимать кнопку, используя сочетание клавиш Ctrl+<символ> (сочетание клавиш зависит от операционной системы).

Слушатели событий

Зачастую вам хотелось бы производить некое действие в ответ на выбор кнопки (особенно кнопки типа push). Этого можно добиться путем добавления интерфейса прослушивания событий SelectionListener (пакет org.eclipse.swt.events) к кнопке. Изменение состояния кнопки (обычно при ее нажатии) генерирует событие. В листинге 5 при щелчке на кнопке Clear выводится сообщение.

Листинг 5. Обработчик события кнопки
import org.eclipse.swt.events.*;
 :
// Clear button pressed event handler
clear.addSelectionListener(new SelectionListener() {
    public void widgetSelected(selectionEvent e) {
        System.out.println("Clear pressed!");  
    }
    public void widgetDefaultSelected(selectionEvent e) {
        widgetSelected(e);
    }
});

Пример этого кода использует неименованный внутренний класс, но вы можете использовать именованные внутренние классы или независимые классы в качестве блоков прослушивания. Большая часть классов ...Listener с двумя или более методами также имеет параллельный класс ...Adapter, который обеспечивает пустые реализации методов, а также может уменьшить время, требуемое для написания кода. Существует также класс SelectionAdapter, реализующий SelectionListener.

Имейте ввиду, что действие, реализуемое в этих методах должно осуществляться мгновенно (обычно за доли секунды), иначе интерфейс будет считаться невосприимчивым. Более длинные действия такие как, получение доступа к файлам, потребует отдельных процессов, но это будет рассмотрено нами в будущих статьях.


Композиты

До недавнего времени мы говорили только об отдельных элементах управления. В большинстве графических интерфейсах несколько элементов объединяются вместе, чтобы обеспечить больше возможностей для пользователя. В SWT, это объединение реализуется с использованием класса Композит (Composite class).

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

В листинге 6 создается композит с границами.

Листинг 6. Создание композита с границами
import org.eclipse.swt.widgets.*;
 :
Composite parent =...;
 :
Composite border = new Composite(parent, SWT.BORDER);

Помимо объекта border внутренний композитный класс Group поддерживает название. Группы часто используются для того, чтобы содержать кнопки типа radio, так как они определяют набор исключающих кнопок.

В листинге 7 создается группа border.

Листинг 7. Создание bordered группы
import org.eclipse.swt.widgets.*;
 :
Composite parent =...;
 :
Group border = new Group(parent, SWT.SHADOW_OUT);
border.setText("Group Description");

Оболочки

Оболочка – это композитный элемент верхнего уровня (рамка или окно), который может не иметь родительского композита. Наоборот, он часто имеет устанавливаемый по-умолчанию родительский класс Display. Оболочки могут иметь много стилей, но самым популярным является стиль SWT.SHELL_TRIM или SWT.DIALOG_TRIM. Оболочки могут быть модальными и немодальными. Модальные оболочки, часто используемые для диалоговых окон, запрещают дальнейшие действия над родительским интерфейсом (если такий есть) до тех пор, пока дочерняя (child) оболочка не закроется.

Листинг 8 создает немодальную оболочку верхнего уровня в стиле фрейма.

Листинг 8. Создание оболочки верхнего уровня
import org.eclipse.swt.widgets.*;
 :
Shell frame = new Shell(SWT.SHELL_TRIM);
 :

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

В листинге 9 создается производная оболочка в стиле диалогового окна.

Листинг 9. Создание диалоговой оболочки
:
Shell dialog = new Shell(frame, SWT.DIALOG_TRIM);
 :

Обратите внимание на оболочку на рисунке 4, созданную с использованием SWT.SHELL_TRIM, и оболочку на рисунке 5, созданную с использованием SWT.DIALOG_TRIM, для уяснения механизма влияния этих параметров.

Рисунок 4. Оболочка с SWT.SHELL_TRIM
Рисунок 4. Оболочка с SWT.SHELL_TRIM
Рисунок 5. Оболочка с SWT.DIALOG_TRIM
Рисунок 5. Оболочка с SWT.DIALOG_TRIM

Менеджеры компоновки

Композиты часто содержат более одного элемента. Элементы могут быть размещены двумя способами:

  1. Абсолютное позиционирование – каждый элемент устанавливается в точные X, Y координаты, а в вашем коде задаются конкретная ширина и высота.
  2. Автоматическое размещение менеджером – Положение элемента X, Y, ширина и высота автоматически задаются менеджером компоновки LayoutManager.

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

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

Менеджер FillLayout

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

В листинге 10 создается композит с использованием вертикального размещения элементов FillLayout.

Листинг 10. Создание вертикального размещения элементов при помощи менеджера FillLayout
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layouts.*;
 :
Composite composite =...;
FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
composite.setLayout(fillLayout);

Менеджер GridLayout

Менеджер GridLayout предоставляет более мощный подход к размещению компонента, напоминающий использование таблиц HTML. Он создает двумерную сетку для расположения компонентов. Компоненты могут быть размещены в одну или более ячеек (называемых cell spanning). Сетка может быть задана в абсолютных единицах или относительно ширины и высоты окна. Элементы добавляются к следующему возможному столбцу в строке. Если больше столбцов в строке не существует, элемент перемещается к первому столбцу следующей строки.

В листинге 11 создается композит из двух строк и двух столбцов, содержащих два текстовых поля с метками. Столбцам может быть задана различная ширина.

Листинг 11. Создание таблицы из элементов
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layouts.*;
 :
Composite composite =...;
GridLayout gridLayout = new GridLayout(2, false);
composite.setLayout(gridLayout);
Label l1 = new Label(composite, SWT.LEFT);
l1.settext("First Name: ");
Text first = new Text(composite, SWT.SINGLE);
Label l1 = new Label(composite, SWT.LEFT);
l2.setText("Last Name: ");
Text last = new Text(composite, SWT.SINGLE);

GridData

Представьте себе ситуацию, когда вам требуется точно определить способ, с помощью которого каждый элемент использует лишнее пространство внутри своей сетки. Чтобы в каждой сетке обеспечить такой тип улучшенного элемента, элементы, добавляемые в композит, управляемый GridLayout, могут иметь экземпляры класса GridData (внутренний класс LayoutData).

В листинге 12 устанавливаются текстовые поля, занимающие любое свободное пространство (пример основан на предыдущем листинге).

Листинг 12. Конфигурация элемента, заполняющего все свободное пространство
first.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
last.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

Построение рабочей программы

Теперь пришло время объединить вместе все рассмотренные нами элементы SWT в простом исполняемом примере: Basic1 (полное описание данного приложения дано в разделе Ресурсы).

Графические интерфейсы SWT требуют для исполнения сконфигурированной среды. Эта среда предоставляется экземпляром, который обеспечивает доступ к графическому устройству базовой операционной системы. Дисплей позволяет вам обрабатывать каждый ввод данных пользователем (с мыши или клавиатуры) для управления вашим графическим интерфейсом.

В листинге 13 среда и графический интрефейс создаются, а потом воспроизводятся.

Листинг 13. Создание и запуск GUI приложения
import org.eclipse.swt.widgets.*;
 :
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Shell Title");

// *** construct Shell children here ***

shell.open();       // open shell for user access

// process all user input events
while(!shell.isDisposed()) {
   // process the next event, wait when none available
   if(!display.readAndDispatch()) {
       display.sleep();
   }
}
display.dispose();  // must always clean up

В данном примере кода создается окно, схожее с окном, показанным на рисунке 6.

Рисунок 6. Пример приложения
Рисунок 6. Пример приложения

Заключение

В данной статье из серии статей о пакетах SWT и JFace я предложил к рассмотрению основные элементы управления SWT widget: текстовые метки, элементы управления текстом, командные кнопки, композит и оболочку. Эти элементы управления, совмещенные с классом display, позволяют создавать полностью рабочие графические интерфейсы.

В второй части данном серии будет показано, каким образом создаются меню и используются дополнительные элементы ввода данных, такие как: список, дерево и таблица.


Загрузка

ОписаниеИмяРазмер
Basic1 Java sourceos-Basic1.java6.39 KB

Ресурсы

  • Оригинал статьи SWT and JFace, Part 1: A gentle introduction
  • В статье "Using JFace and SWT in stand-alone mode" (developerWorks, Январь 2003) представлены некоторые основные классы JFace (а также несколько SWT widgets) плюс некоторые подсказки, приемы и вопросы, касающиеся разработки.
  • Сайт Sun Microsystems Web site – подходящее место для начала ознакомления с информацией о разработке на языке Java. Здесь вы найдете новостые ссылки, форумы, статьи и дистрибутивы.
  • Java Foundation Classes (JFC/Swing) компании Sun включают ссылки на загружаемые материалы, техническую информацию, статьи “Как сделать”, а также новости о JFC/Swing.
  • Swing Connection компании SUN – это страница обновлений и новостей для людей, интересующихся пакетом Swing.
  • Компания Sun предлагает сайт для Пользователей языка Java. В нем можно найти игры, описания, а также другие проявления использования Java-технологий, в том числе и дистрибутивы.
  • Документ Eclipse In Action: A Guide for Java Developers (Independent Publishers Group, 2003) – является обязательным документом для прочтения Java-разработчиками, использующими Eclipse.
  • Просмотрите все статьи об Eclipse на сайте developerWorks.
  • Получите последнюю версию Eclipse, открытой среды разработки приложений.
  • Поделитесь своими вопросами и мыслями об этой статье с автором и другими читателями на форуме форуме Eclipse.
  • Чтобы больше узнать об Eclipse, посетите сайт eclipse.org. Здесь вы найдете техническую документацию, статьи “Как сделать”, обучающие материалы, дистрибутиы, информацию о продуктах и многое другое.
  • Посетите сайт developerWorks Open source zone для получения развернутой конкретной информации по использованию, сведениям об инструментарии, а также об обновлениях проекта, чтобы больше узнать о разработке с открытыми технологиями и использовании их с продуктами IBM.
  • Внесите в ваш новый разработанный открытый проект новшества используя ПО IBM trial software, доступное для загрузки или на DVD носителе.
  • Станьте членом сообщества developerWorks, участвуя в форумах developerWorks blogs.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



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

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java
ArticleID=96926
ArticleTitle=Пакеты SWT и JFace, Часть 1: Небольшой обзор
publish-date=05032005