Standart Widget Toolkit

Patrick
2005-03-14

Этой статьей я начинаю новый цикл статей, посвященных библиотеке SWT (Standard Widget Toolkit for Windows, а здесь для других ОС).

Standart Widget Toolkit (SWT) - это быстродействующая альтернатива стандартным библиотекам AWT и Swing, которая была разработана подразделением Rational фирмы IBM и компанией Object Technology International (OTI).

Постоянным источником проблем при разработке набора элементов управления является противоречие между переносимостью и интеграцией с собственным оконным интерфейсом платформы. Java AWT предоставляет низкоуровневые элементы управления, такие как списки (lists), текстовые поля (text fields) и кнопки (buttons), но не предоставляет высокоуровневых элементов, таких как деревья (trees). Элементы управления AWT реализованы напрямую через собственные элементы управления всех платформ. Построение пользовательского интерфейса с использованием только AWT подразумевает программирование на минимальном общем множестве элементов управления оконных систем всех платформ. Swing устраняет эту проблему, эмулируя такие элементы управления, как деревья и таблицы. Swing также предоставляет прослойку, которая позволяет создавать приложения, которые выглядят и работают так же, как и приложения, использующие собственный оконный интерфейс платформы.

Реализация SWT использует собственные элементы управления платформы, если это возможно; если же соответствующие элементы управления отсутствуют, SWT предоставляет их эмуляцию. Общие низкоуровневые элементы управления, такие как списки, текстовые поля и кнопки, везде реализованы на основе собственных элементов управления платформы. Но некоторые необходимые высокоуровневые элементы управления требуют эмуляции на некоторых оконных системах. Например, инструментальная линейка (toolbar) SWT реализован на основе «родного» элемента управления в Windows, но требует эмуляции на платформе Motif®. Такая стратегия помогает SWT поддерживать общую модель программирования на всех платформах, позволяя приложениям в высшей степени соответствовать по виду и поведению «родным» приложениям этих платформ. Тесная интеграция с собственным оконным интерфейсом системы не ограничивается видом и поведением элементов управления. SWT также взаимодействует со специфичными возможностями платформ, такими как drag & drop, и может использовать компоненты, разработанные на основе компонентной модели операционной системы, например компоненты Windows ActiveX.

Внутри реализация SWT представляет собой отдельные и обособленные реализации на Java для каждой из поддерживаемых платформ. Библиотеки Java для каждой платформы совершенно различны, каждая из них построена на специфичном API собственной оконной системы платформы. (В отличие от AWT, которые размещает отличия реализации элементов управления, специфичные для каждой из платформ, в коде на C, отделяя их от общего множества методов Java.) Так как в родных элементах управления платформ не заключено никакой особой логики, SWT целиком реализован на Java. Тем не менее, код на Java покажется знакомым разработчикам, работающим на различных платформах.

Первое окно на SWT

Перед тем как мы начнем немного информации по классам SWT:

  • Display. Находится в пакете org.eclipse.swt.widgets. Display - соединительное звено между калссами SWT и ОС. По этой причине объкт этого класса создается первым.
  • Shell. Активное окно приложения, то есть само окно программы.

Рассмотрим пример диалоговой программы (файл HelloWorld.java):

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;

public class HelloWorld {

    public static void main(String[] args) {
	//Создаем объект Display для связи SWT
	//с дисплеем операционной системы
	Display display = new Display();
	//Создаем окно программы
	Shell shell = new Shell(display);
	Label label = new Label(shell, SWT.CENTER);
	label.setText("Hello, World");
	shell.open();
	while (!shell.isDisposed()) {
	    if (!display.readAndDispatch()) {
		label.setBounds(shell.getClientArea());
		display.sleep();
	    }
	}
	//Ресурсы операционной системы
	//должны быть освобождены
    display.dispose();
	}
}

Для компиляции файла HelloWorld.java из командной строки необходимо набрать следующее:

javac -classpath <полный путь к swt.jar> HelloWorld.java

А для запуска приложения:

java -classpath <полный путь к swt.ja> -Djava.library.path=
  <полный путь к native библиотеке> HelloWorld

Следующие две строки создают объекты Display и Shell:

Display display = new Display();
Shell shell = new Shell(display);

Display – это соединительное звено между классами SWT и ОС. По этой причине объект этого класса создается первым. Shell – изображает активное окно приложения, то есть само окно программы.

Следующее строки создают элемент управления окном(widget) Label, т.е. ярлык с текстом:

Label label = new Label(shell, SWT.CENTER);
label.setText("Hello, World");
label.setBounds(shell.getClientArea());

Элемент Label создается с ссылкой на объект Shell, который в свою очередь является непрямым наследником класса Composite. Когда SWT встречает первую строку, он знает, что базовая система управления окнами должна создать элемент Label, взаимодействующий с объектом Composite.

Чтобы показать окно нужно вызвать метод open объект Shell:

shell.open();

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

Основной цикл приложения:

while (!shell.isDisposed()) {
    if (!display.readAndDispatch()) {
        display.sleep();
    }
}

Этот цикл есть в каждом SWT приложении. Этим циклом первым делом проверяется не закрыл ли пользователь окно. Если окно все еще открыто проверяется очередь событий для любых сообщений, которые базовая система или любая часть программы может сгенерировать. Если нет событий в очереди приложение спит – выполняется метод sleep, ожидаются сообщения. Как оно пришло, цикл снова повторяется после проверки того, что событие не должно освободить занятые ресурсы.

В примере я добавил в в тело управляющей структуры if следующую строчку:

label.setBounds(shell.getClientArea());

То есть как оболочка получила сообщение о событии(в данном случае изменение размера) – установить ярлык с надписью по центру окна.

В заключение вызывается метод dispose:

display.dispose();

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

Если у вас есть какие-то вопросы - пишите.

Hosted by uCoz